从图片的数据块存储方式来看png分两种html
1.索引色模式存储。png8的索引色透明就采起该种方式。该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte)。而图片的数据块里的像素直接存储调色板里的索引值,根据索引寻找对应的颜色及透明色。透明色的指定由PLTE后的tRNS图像透明数据块指定。布尔透明和alpha透明的区别是alpha透明为透明色附加了8位(1byte)的透明级别。tRNS图像透明数据块的长度与调色板对应以下。url
PLTE块格式为: spa
循环 htm
RED: 1byte blog
GREEN:1byte 索引
BLUE: 1byte 图片
ENDget
tRNS块布尔透明格式为: it
循环 table
if(对应调色盘颜色非透明)
0xFF: 1byte
else
0x00: 1byte
END
tRNS块alpha透明格式为:
循环
if(对应调色盘颜色非透明)
0xFF: 1byte
else
0x**: 1byte (具体的透明级别共256级)
END
tRNS块的循环长度为调色盘的颜色数,至关于调色板颜色表的一个对应表,标识该颜色是否透明,0xFF(255)不透明,0x00(0)全透明。
2.真彩色存储(非专业术语)。该类存储不存在调色板(或者有调色板供非真彩色显示程序用它来量化图像数据,从而显示该图像。),在数据块的像素里直接存储颜色信息。这里就有常说的RGB_888(24bit)、RGB565(16bit)、RGBA_8888(32bit)、RGBA_4444(16bit)、RGBA5551(16bit)等等。png24及png32都是该类存储。
从图片的色彩位数来看经常使用如下几种
1.png8。这个8理解为位深,但这个位深可减小。存储方式可为索引色存储。索引色位深可为1,2,4,8。随着位深的减小可支持的颜色也减小。可支持8位色彩共256(2的8次方)种颜色。
1.png16。这个8理解为位深,存储方式可为RGB565(16bit)、RGBA_8888(32bit)、RGBA_4444(16bit)、RGBA5551(16bit)。但这个位深可减小。索引色位深可为1,2,4,8。随着位深的减小可支持的颜色也减小。可支持8位色彩共256(2的8次方)种颜色。
2.png24。24也理解为位深,存储方式为RGB_888。可支持24位色彩共1600多万(2的24次方)种颜色。
3.png32。32也理解为位深,存储方式为RGB_888。实际上为png24+8位的透明通道。一样支持24位色彩共1600多万(2的24次方)种颜色。
可是位深是不定的,以上仅仅列举经常使用的几种,还能够是无透明通道的3*2^(常有八、1六、32)或有透明通道的4*2^(常有八、1六、32)。
那么咱们使用libpng如何判断png的格式。
/*获取位深,颜色类型*/
channels = png_get_channels(png_ptr, info_ptr); /*获取通道数*/
bit_depth = png_get_bit_depth(png_ptr, info_ptr); /* 获取位深 */
color_type = png_get_color_type(png_ptr, info_ptr); /*颜色类型*/
根据这些咱们能够由如下表格进行判断
Bit depth | 1 byte | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:24或32或48 |
ColorType | 1 byte | 颜色类型: 0:灰度图像 2:真彩色图像 3:索引彩色图像 4:带α通道数据的灰度图像 6:带α通道数据的真彩色图像 |
参考:
http://baike.baidu.com/link?url=FckD48sfXstBMBnODg40OJvyMGNsiEy1-4SbwE_TSN9WK1WFaIkyjVe5d7YeUlbwKaAe_4swGsSg21PFKzAoba
http://www.cnblogs.com/PeunZhang/archive/2013/05/30/3050394.html
http://blog.163.com/iwait2012@126/blog/static/16947232820124411174877/