0%

Bitmap

只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象

《Bitmap的解释》

《Bitmap的格式》

Bitmap(位图)全解析

Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 也是前面学的那13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框!

Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以 进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作!

Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔), 来画各种形状或者写字,又可以用Path(路径)来绘制多个点,然后连接成各种图形!

Matrix(矩阵):用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的 平移,缩放,旋转,倾斜等!

说明位图,矢量图,像素,分辨率,PPI,DPI?

位图

位图图像(bitmap), 亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象,逼真地表现自然界的景象。缩放和旋转容易失真,同时文件容量较大。bmp,jpg,gif,png。便携式网络图形(Portable Network Graphics,PNG)是一种无损压缩的位图图形格式,截图首选png格式。

位图实质为使用像素阵列来表示的图像(注意“表示”两个字),用于展现在显示器或者用于打印,位图并未真实存在的文件,但它可以生成真实性的文件如png、bmp、jpg、gif、psd、tif等。通过位图我们可以直接操作图像像素,例如有像素决定的颜色、灰度值、背景。

矢量图像

由数学向量组成,文件容量较小,在进行放大、缩小或旋转等操作时图象不会失真,缺点是不易制作色彩变化太多的图象。

像素

像素,又称画素,为图像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“图像元素”之意。像素表示图形尺寸的大小。不同设备显示效果相同。这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。

分辨率

Image resolution,中国大陆译为“分辨率”,香港、台湾分别译为“解像度”和“解析度”,又称“解像力”,泛指量测或显示系统对细节的分辨能力。分辨率越高代表视频质量越好,越能表现出更多的细节;但相对的,因为纪录的信息越多,文件也就会越大。图像处理或信号处理中的空间或时间分辨率:能够分辨图像中两个点或线的能力。描述分辨率的单位有:dpi(点每英寸)、lpi(线每英寸)和ppi(每英寸像素)。从技术角度说,“像素”只存在于电脑显示领域,而“点”只出现于打印或印刷领域。对电脑显示屏等,分辨率是用像素数目衡量;对数字文件印刷,分辨率是通常用每英寸所含点或像素〔dpi〕来衡量。像素数目大的数码相机,较能够输出高分辨率的图像。因此,相机制造商在广告上多使用像素数目代表分辨率。不过,相机是测量仪器而不是显示设备。镜头对视频质量极为重要,光以用像素数目代表分辨率是非常误导的。美国、日本和国际标准都建议不应使用此一定义。

提起分辨率,我们需要了解两个概念,图像分辨率和输出分辨率,图像分辨率是每英寸的像素数,以ppi为单位,图像分辨率又常常被表示成每一个方向上的总像素数量,比如640×480像素、1280×960像素等。而决定图像输出质量的是图像的输出分辨率,描述的是设备输出图像时每英寸可产生的点数(dpi),以dpi为单位,两者有联系但并不总是相等的。

以21.5寸的显示器为例,设置屏幕分辨率为19201080(推荐设置,还可以设置成最小800600),下载一张19201080的图片,当显示为实际大小时,图片正好可以覆盖整个屏幕,再将屏幕分辨率设置为1360768,这时当查看图片的实际大小时,发现屏幕不能承下整个图片。也就是说,21.5寸的显示器设置19201080,是将屏幕分为19201080个小块(也就是像素),当显示19201080的图片时,屏幕上的所有块(像素)正好都被占用,当显示器分辨率为1360768时,将21.5寸的屏幕分成1360768个小块,再次显示19201080大小的图片时,发现屏幕上的所有块不能承下图片,需要左右移动才能查看完整的图片。这也解释了,为什么将屏幕分辩率调小之后,会发现照片和文字变大的问题。

例如分辨率为1280*720表达的就是:屏幕长上有1280个像素,屏幕宽上有720个像素。每一个像素点都是单独染色,像素点的颜色由RGB三原色与灰度值决定。

PPI

每英寸像素(英语:Pixels Per Inch),又被称为像素密度,是一个表示打印图像或显示器单位面积上像素数量的指数。一般用来计量电脑显示器,电视机和手持电子设备屏幕的精细程度。通常情况下,每英寸像素值越高,屏幕能显示的图像也越精细。是将屏幕尺寸与分辨率整合到一起的一个属性。以屏幕尺寸为4吋的iPhone 5为例,分辨率为1136x640,像素密度为326PPI。而分辨率为1920x1080的家用21.5寸显示器,像素密度为103PPI。Retina显示屏(英文:Retina Display)是一种由苹果公司设计和委托制造的显示屏,具备足够高像素密度而使得人体肉眼无法分辨其中单独像素点的液晶屏,最初采用该种屏幕的产品iPhone 4由执行长史蒂夫·乔布斯于WWDC2010发布,其屏幕分辨率为960×640(每英寸像素数326ppi)。这种分辨率在正常观看距离下足以使人肉眼无法分辨其中的单独像素。

DPI打印输出分辨率(英语:Dots Per Inch,每英寸点数)

是一个量度单位,用于点阵数位影像,意思是指每一英寸长度中,取样或可显示或输出点的数目。打印机所设定之分辨率的DPI值越高,印出的图像会越精细。打印机通常可以调校分辨率。例如撞针打印机,分辨率通常是60至90 DPI。喷墨打印机则可达1200 DPI,甚至9600 DPI。激光打印机则有600至1200 DPI。一般显示器为96 DPI。

Reference

[1]说明位图,矢量图,像素,分辨率,PPI,DPI?
[2][图形图像]—位图Bitmap、分辨率Resolution、像素Pixel(px)、距离密度dpi,基本概念与相互之间的联系
[3] Bitmap(位图)全解析 Part 1
[4]Android 之 Bitmap
[5]Android中文API(136) —— Bitmap
[6]Android资源文件res的使用详解(strings,layout,drawable,arrays等)

字符的点阵显示原理及实现

武汉大学遥感信息工程学院,屈伟军

首先介绍什么是点阵字库。需要理解的是,点阵字库是一个数据文件,在这个数据文件里面保存了所有字符的点阵数据。至于什么是点阵,我想大家都知道。如果使用过“文曲星”之类的电子辞典,在那个液晶显示屏上就可以明显地看出“点阵”的痕迹所在。PC机上也是如此,字符是由点阵来组成的,不同的是PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此“点阵”的痕迹也就不那么明显了。点阵从本质上讲就是单色位图,它使用一个比特位来表示一个点,如果某个比特位为0,表示该位置没有点,如果为1则表示该位置有点。那么点阵字符的数据存放细节到底是怎么样的呢?其实十分简单,举个例子最能说明问题。比如说16×16的字符点阵,一行有16个点,需要用16个比特即2个字节来存放。第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面……以此类推。一个点阵共有16行,这样我们马上就可以计算出存放一个点阵总共需要2×16 = 32个字节。看看下面这个图形化的例子:

0000000100000000000000000000010000000 0000000001010001010101010101010100000 0000000000010000000000000000010000000 0000010000000000010000000000010000000 0000000101000000010000000000010000000 0000000001000000010000000001000000000 0000000000000100000100000001000000000 0000000000010000000100000100000000000 0000000001000000000001000100000000000 0000010101000000000000010000000000000 0000000001000000000001000100000000000 0000000001000000000100000001000000000 0000000001000000010000000000010000000 0000000001000001000000000000010101000 0000000000000100000000000000000100000 0000000000000000000000000000000000000

hanchar20180329.JPG

可以看出这是一个宋体“汉”字的点阵,我们可以写出这个点阵的点阵数据是:0x40,0x08,0x37,0xfc,0x10,0x08……当然,写这个确实很麻烦,所以我不再继续下去。我这样做,只是为了说明在点阵字库中,每一个点阵的数据就是按照这种方式存放的。

当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12×12的点阵(如图2所示)。那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面8个点存放在一个字节里面,每一行剩下的4个点也使用一个字节来存放。也就是说,剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都为0。这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址。对于其他不规则的点阵,也是按照
这个原则进行处理的。这样我们可以得出一个M×N的点阵所占用的字节数为(M+7)/8×N。

mechar20180329.JPG
图1 字符“我”的12×12点阵

在明白了点阵字符的存放结构以后,我们很容易就可以写出一个显示任意大小的点阵字符的函数。

接下来的问题就是如何在汉字库中寻址某个汉字的点阵数据。要解决这个问题,首先需要了解汉字在计算机中是如何表示的。在计算机中英文可以使用ASCII码来表示,而汉字使用的是扩展ASCII码。所谓扩展ASCII码,也就是把ASCII码的最高位由0变为1的ASCII码,简单的说就是码值大于等于128的ASCII码。一个汉字由两个扩展ASCII码组成,第一个扩展ASCII码用来存放区码,第二个扩展ASCII码用来存放位码。

在GB2312-80标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有94×94 = 8836个汉字。

在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中又是按照位的顺序来存放的。在汉字的机内码中,汉字区位码的存放是在扩展ASCII码的基础上进行的,存放时将区码和位码都加上了32,然后分别存放在两个扩展ASCII码中。具体的说就是: 第一个扩展ASCII码 = 128+32+汉字区码 第二个扩展ASCII吗 = 128+32+汉字位码 如果用char hz[2]来表示一个汉字,那么可以计算出这个汉字的区位码为: 区码 = hz[0]-128-32 = hz[0]-160 位码 = hz[1]-128-32 = hz[1]-160 这样,我们就可以根据区位码在文件中进行寻址了,寻址公式如下: 汉字点阵数据在字库文件中的偏移 = ((区码-1)×94+位码)×一个点阵字符占用的字节数 在寻址以后,便可读取汉字的点阵数据到缓冲区进行显示了。 以上介绍完了中文点阵字库的原理,当然还有英文点阵字库。英文点阵字库中单个点阵字符数据的存放方式与中文是一模一样的,唯一不同的是在对点阵字库的寻址上,
英文使用的是
ASCII码,其码值是0到127,寻址公式为: 英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码×一个英文字符占用的字节数 可以看到,区分中英文的关键就是,一个字符是ASCII码还是扩展ASCII码,如果是ASCII码,其小于128,则使用的是英文字库,如果是扩展ASCII码,其大于等于128,则与其后面的另一个扩展ASCII码组成汉字内码,使用中文字库进行显示。只要正确区分ASCII码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了。
下面给出字符点阵输出的一个例子:

university20180329.JPG

欢迎关注我的其它发布渠道