纯⽆趣技术贴,关于⾊深、位深、图像深度详解
因为近期接触了⼀点嵌⼊式开发,需要的图⽚资源格式和以往接触的移动及web开发差别⽐较⼤,才有了下⾯这篇⽂章。因为⽐较晦涩,不需要的就可以绕⾏了。
图像深度、⾊深、位深的⼤统⼀
⾸先明确⼀点,图像深度就是⾊深Color Depth。关于⾊深和位深Bit-depth,查了很多资料,众说纷纭,有说⾊深是存储每个像素所⽤的bit数,⽽位深是描述通道的属性,那我们通常所说的24位真彩和16位全彩颜⾊模式,这⾥的24和16是位深还是⾊深呢?其实⼤可不必纠结,可以统称为深度。在显⽰器的参数中,使⽤更多的是位深Bit-depth的概念。后⾯会详细说明深度和具体颜⾊的关系。
虽然在设计师眼⾥,PNG、BMP、JPG、JPEG、GIF这些有分辨率属性的点阵图像统统称之为位图,来对应可任意缩放的⽮量图,⽐如SVG,但在⼯程师,尤其是硬件⼯程师眼⾥,位图可能专指BMP格式,所以,⼀定要和开发⼈员提前确认,尤其是当涉及到嵌⼊式开发时,更是如此,越底层越⿇烦越受限。
计算机存储图像的原理
因为对于设计师最常⽤的PS软件在保存BMP格式时有深度的选项,所以下⾯都以BMP格式为例来说明,尤其是PNG和JPEG都是经过压缩的,具体压缩原理不明,也不作解释。追本溯源,作为只能识别⼆进制
语⾔的计算机,在进⾏图像存储时存的是什么呢?像素点。⼀个
8px*8px的图⽚,⼀共有64个像素点,计算机在存储时,会针对这64个点依次进⾏存储。当⼀个图⽚保存成hex格式(这是烧⼊单⽚机需要的格式),⽤⽂本编辑器打开,会发现全部由16进制的编码串组成,这⾥的每⼀串编码就是⼀个像素点,64个编码串解析后呈现出不同的颜⾊,最终组成了图⽚。
位深值分配给通道
在BMP格式进⾏存储的时候,如图所⽰,系统会有⼀个关于深度的提⽰,当我们由基本模式切换到⾼级模式后,看到16位、24位和32位的具体选项,(X或A)nRnGnBn或RnGnBn的形式表⽰,(n表⽰分配给该通道的位数值)。因为每个通道只⽀持256(0-255)个值,因此,通道拥有的位数值不会⼤于8(256是2的8次幂)。
举⼀个16位的说明,R5G6B5,并不是⾊值的表⽰⽅法RGB(5,6,5),⽽是这16位的位深的通道分配⽅法,R值⽀持2的5次幂(32)个值,G值⽀持2的6次幂(64)个值,B值⽀持2的5次幂(32)个值,如果16位分配给R8G8B0,但在最终颜⾊的组成上,65536种颜⾊会缺少蓝⾊的元素,只有红和绿的65536种组合。当然,这是极不合理的,只有RGB的组合才能形成彩⾊,所以位数要平均分配给
R,G,B和透明通道Alpha四个通道。 这些通道的设置基本上就是常⽤设置。
对于Android开发⼈员,可能不陌⽣,Bitmap ConfigARGB_8888,对应这⾥24位的X8R8G8B8,ARGB_4444对应16位的
X4R4G4B4,RGB_565对应16位深的R5G6B5,没有透明度。
因此,位深是8位的图,最多只有2的8次幂,也就是256种颜⾊,远达不到我们对图⽚的⾊彩的需要,对于嵌⼊式系统或者⼯控领域,显⽰器才会是16位以下。⽽当位深达到16位时,⽀持的颜⾊就有2的16次幂,65536种颜⾊,也就是我们说的⾼彩。⽽GIF格式的图⽚,就仅能⽀持256种颜⾊,这也是为什么转成GIF有时会失真的原因。其中,32位和24位在RGB通道上是相同的,但8位⽤来保存Alpha通道。换句话说,在彩⾊的表现上并⽆差别,但增加了8位,即2的8次幂(256)阶⾊的灰度,只是颜⾊的过渡上更加⾃然,已经到了⼈眼⽆法识别差别的程度。
在PS保存成BMP格式种,提供了1位、4位、8位、16位、24位和32位的选项,这只是常⽤位深,6位可不可以?当然是可以的,对于6位的图像,可以分配到不同的通道R2G2B2,⼀共⽀持4*4*4 共计64种不同的颜⾊。即使是100*100 ⼀共⼀万个像素点的图⽚,对于6位位深⽽⾔,也只有64种颜⾊可以选择。⽐如我们项⽬中,显⽰芯⽚的规格书中明确规定了⽀持6-bit,R⽀持的四个值对应0,1/3R,2/3R 和1R,G⽀持的四个值对应0,1/3G ,2/3G和1G,B⽀持的四个值对应0,1/3B ,2/3B和1B。怎么转换成设计师能看懂的语⾔呢,以红⾊R为例,RGB颜⾊的表⽰⽅法中可以在0-255范围内进⾏设置,限定的四
个值就依次变成了(0,75,150,255),这样看就明确了很多,在进⾏⾊彩选择时RGB(75,150,75)这种颜⾊,或者RGB(0,75,150)等等,只要保证是这四个值的组合就可以了。最简单当⽅法就是下载⼀个64位⾊的⾊板。
位深与图⽚尺⼨的正相关
svg矢量图下载说完了位深的分配,再来看存储,也就是对图⽚尺⼨的影响。
bit⽐特和Byte字节
bit是计算机最基本的存储单元,是⼆进制的“0”或者“1”,⽽Byte通常作为存储单位。Byte和bit存在换算关系,1Byte=8bit。
⼀个8位深的图⽚,储存每个像素所需要的位数是多少?根据位深的含义,每个像素点可存放8位⼆进制,每个⼆进制是⼀个bit,因此,⼀个像素需要8bit,也就是1Byte。⽽16位颜⾊的图,存储每个像素点,存放的是16位⼆进制,存储⼀个像素则需要2Byte。当然了,因为计算机在存储图⽚时还要存储像素之外的如位图头、位图信息、调⾊板等其他信息(就像txt⽂档的尺⼨并不仅仅是⾥⾯⽂本所占据的字节的数量),因此并不和我们的换算结果完全相同,只要了解不同位深导致的图⽚尺⼨变化的原因就好。对于BMP格式的图⽚,不受颜⾊的约束的,每个⾊素点,纯⿊纯⽩灰度或者彩⾊的,存储所占⽤的
字节数是相同的,影响⼤⼩的只有位深。下⾯这张图,所有图⽚的分辨率都是8*8像素,我⽤不同后缀的明明⽩⽩来区分导出时选择的位深。显⽽易见的是,只要是16位深,⽆论灰⾊、纯红、任意RGB颜⾊、甚⾄是渐变,在存储时都是相同的尺⼨。⽽相同分辨率的相同的灰⾊填充的图⽚,在保存成24位深和32位深时,相对于16位,尺⼨就呈现⼀个阶梯增加的趋势。
⽽PNG这种压缩格式,则受制于⾊彩的丰富度。下⾯这张图⽚的对⽐能很好的说明问题,同样是256px*256px的图⽚,⼀个⾊彩丰富,⼀个只有两种颜⾊,在同样选择PNG-24时,尺⼨差异很⼤,但BMP同样是16位位深,则是相同的尺⼨。
总结
深度了解图⽚位深对⾊彩影响的机制,主要就是在⾯对具体的项⽬时,可以更加灵活的选择更合适的图⽚格式,以及在⾊彩的选取上,如何才能适应不同的显⽰芯⽚。把硬件规格说明书中晦涩难懂的部分转换成设计时需要参考的资源。