以具体图片为例,借助VS2019分析png图像格式。
一、PNG格式
PNG,图像文件存储格式,其目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位。PNG使用从LZ77派生的无损数据压缩算法,一般应用于JAVA程序中,或网页或S60程序中是因为它压缩比高,生成文件容量小。
二、PNG特性
体积小
索引彩色模式
更优化的网络传输显示
支持透明效果
三、PNG文件结构
1、文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
利用VS2019的二进制编辑器打开png图片(利用Visual Studio以二进制方式打开文件方法参考:https://blog.csdn.net/MMX386/article/details/117267325)
可以看到,图中首行信息与png署名域十六进制数相同,即判断该文件是png文件。
(可以看到,此图片包含IHDR、sRGB、gAMA、pHYs、IDAT、IEND六个数据块)
2、数据块结构
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。每个数据块都由下表所示的的4个域组成:
蓝色框:0D,数据块中数据域的长度Length
红色框:49 48 44 52,数据块类型码Chunk Type Code
黄色框:Chunk Data(数据块数据),具体象征见下文IHDR。
绿色框:82 D0 30 5,存储用来检测是否有错误的循环冗余码CRC
(1)关键数据块:包含IHDR、PLTE、IDAT、END。
- 文件头数据块IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
该图片数据块数据如上图,其中各部分具体含义如下:
00 00 02 B4:图像宽度
00 00 00 CC:图像高度
08:图像深度,8bit
06:带α通道数据的真彩色图像
00:压缩方法
00:滤波器方法
00:非各行扫描
- 调色板数据块PLTE
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
PLTE数据块是定义图像的调色板信息,可包含1~256个调色板信息,每一个调色板信息由3个字节组成:
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……
调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
- 图像数据块IDAT
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
- 图像结束数据IEND
图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
通常为:00 00 00 00 49 45 4E 44 AE 42 60 82
即数据块的长度总是0(00 00 00 00),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
(2)辅助数据块
- sRGB数据块(Standerd RGB colour space)和图像γ数据块gAMA
红色框:长度为1,符合sRGB的标准
黄色框:数据块的类型码,73 52 47 42是sRGB的ASCII码数值。
绿色框:数值为0,适用于喜欢以输出色域为佳,而以色度精度为代价的图像,例如照片。
蓝色框:循环冗余校验码
通常在s R G B 的后面同时写入g A M A 数据块:
红色框:长度为1,符合gAMA的标准;
黄色框:数据块的类型码,67 41 4D 41是AMA的ASCII码数值;
绿色框:gAMA数据块的数据为0xB18F,十进制为45455;
蓝色框:循环冗余校验码。
- pHYs数据块(physical pixel dimensions)
其中,Unit specifier是这样定义的:
红色框:长度为9,符合pHYs的标准;
黄色框:数据块的类型码,70 48 59 73是pHYs的ASCII码数值;
绿色框:x轴上每米像素数0x1274;
蓝色框:y轴上每米像素数0x1274;
黑色框:01,unit is the metre,将单位定义为米;
紫色框:循环冗余校验码。
参考:
[1]:png360百科pnghttps://baike.so.com/doc/7120399-7343533.html
[2]:PNG文件格式详解https://blog.csdn.net/bisword/article/details/2777121
[3]:PNG文件格式解析https://blog.csdn.net/weixin_41926958/article/details/105163016
[4]:PNG图像格式分析https://blog.csdn.net/QKKKKathy/article/details/123448496?spm=1001.2014.3001.5502