像素(Pixel)
像素,从字面上来理解就是图像的基本元素,类比于现实世界中原子与物质之间的关系。
pixel上图是某张图片放大后截取出来的,其中的每一个小格子就是一个像素点,每个像素点有且仅有一个颜色。请注意,这里提到的像素是位图才有的概念!
位图(Bitmap)与矢量图(Vector)
位图,也可以称为点阵图,是由像素点组成的。
bitmap可以看到,放大后的位图出现了“马赛克”。
矢量图是由数学向量构成,所以矢量图是没有限定大小的。举个例子,我们不能说一条直线有5厘米长,因为直线的长度是无限的,有具体长度的那叫线段。
上图是在Sketch中画出来的一个矢量按钮,可以看到,它被放大之后依然是清晰的。
那么问题来了,貌似位图相比矢量图来说弱爆了,但为什么我们常见图片几乎都是位图呢?
这问题在知乎上有过讨论,大概归纳为两点:
- 我们的识别能力是有限的,我们自己都无法描述出图像的一些细节。
- 对于细节丰富的图像,需要大量的路径等信息来描述,这时产生的文件会非常巨大。
对于我们而言,我们每天都在看的屏幕就是一个位图。
分辨率与像素密度
iPhone 4发布的时候震惊了全世界,其中有一项革命就是其带来的“视网膜(Retina)”屏。这是什么鬼?
iPhone 4的屏幕横向有640个像素,纵向有960个像素,屏幕对象线为3.5英寸。以同时期主流14英寸的笔记本为例,屏幕横向1366个像素,纵向768个像素。虽然笔记本屏幕总像素比iPhone 4多,但由于iPhone的屏幕小,所以单位面积下的像素量是比笔记本高非常多的,达到了惊人的(那时候惊人~)332DPI(像素每英寸)!什么概念?就是每个像素点非常的小,小到在正常观看距离下,人眼已经分不清单个像素了。
密度无关的像素(Density-independent pixel)
手机屏幕的分辨率差别是很大的,举个例子:HTC G1的屏幕分辨率是320*480。而魅族M9的分辨率是640*960。假如有一张320*480的图片,在G1上刚好是全屏显示,在M9上就只有屏幕的四分之一大小了(不缩放的情况)。
所以,在Android平台上,如果我们用像素去描述一个控件的大小,那么对于不同分辨率、不同像素密度的设备,显示效果是千差万别的。
为了解决上边的问题,谷歌引入了dip(Density-independent pixel,一般简称dp)的概念。
px = dip * (dpi / 160)
比如G1的DPI是160,也就是说一个dip对应一个像素,对于M9而言,其DPI为330,大概是一个dip对应两个像素。所以用dip去指明一个控件在不同屏幕上显示出来的大小应该是一样的。引入了dip就是为了解决对不同屏幕的适配问题。谷歌官方有给出详细文档。
ARGB
如果你使用放大镜去对着屏幕看,你能看到类似下图的画面:
sub-pixel这是屏幕的子像素或者叫次像素(Sub-Pixel)。图中的三种颜色称为光的三原色,通过调节红(Red),绿(Green)和蓝(Blue)这三种光的不同亮度配比,可以显示出各种各样的色彩。通常我们会把这个亮度分为256个级别,刚好是两位十六进制,即0x00~0xFF。rgb依次写就可以描述出一个颜色,比如0xFF0000,就表示红色。如果颜色还有透明度信息,那就在最前边再加两个十六进制表示透明度(0x00表示完全透明、0xFF表示完全不透明),比如:0xFF0000FF,表示一个完全不透明的蓝色。
网友评论