文章目录
一、PNG格式基础
PNG格式文件结构很清晰,仅由两部分构成:(1)文件头 (2)文件数据块(chunk)
(1)文件头
PNG的文件头为8个字节:
89 50 4E 47 0D 0A 1A 0A (16进制)
文件头是固定的,用以标明该文件是一个PNG格式文件。
(2)Chunk数据块
PNG格式文件中,除了文件头都是chunk数据块,不同的数据块在文件中起到不同的作用。
数据块结构
每个数据块由以下结构组成:
| 名称 | 字节数 | 备注 |
|---|---|---|
| Length | 4 | Chunk Data字段的长度 |
| Chunk Type Code | 4 | 标志数据块的类型(ASCII码) |
| Chunk Data | 由Length决定 | 数据 |
| CRC | 4 | 循环冗余检测 |
因此,一个数据块的长度等于 12 + L e n g t h 12+Length 12+Length
数据块分类:
按照标准分为关键数据块和辅助数据块两种。只有关键数据块是必要的。
下表列出了关键数据块:
| 数据块符号 | 数据块名称 |
|---|---|
| IHDR | 文件头数据块 |
| IDAT | 图像数据块 |
| IEND | 图像结束数据块 |
| PLTE | 调色板数据块 |
一个真彩色PNG文件必须包含以上关键数据块的前三种,而伪彩色PNG图片还必须包含PLTE数据块,以携带调色板信息。
其它非关键数据块写到备忘里。
文件头数据块
IHDR是文件头数据块,描述了图片的一些元数据,13字节的数据分布如下:
| 域名 | 字节数 | 备注 |
|---|---|---|
| Width | 4 | 图像宽度 |
| Height | 4 | 图像高度 |
| Bit depth | 1 | 比特深度 |
| ColorType | 1 | 表明图像的颜色类型: 0:灰度图像;2:真彩色图像;3:索引彩色图像 |
| Compression method | 1 | 压缩方法 |
| Filter method | 1 | 滤波器方法 |
| Interlace method | 1 | 非隔行扫描为0、隔行为1 |
图像数据块
IDAT是图像数据块,存放着图像真正的数据信息。
图像结束数据块
IEND是图像结束数据块,它标志着图像的结束。
没有真正的数据内容,因此Length字段为0,所以,IEND数据块总是由以下字符组成:
00 00 00 00 49 45 4E 44 AE 42 60 82
调色板数据块
一个8bit伪彩色图像必须携带调色板数据块,它的数据部分由 2 8 2^8 28个以下结构构成:
| 颜色 | 字节 |
|---|---|
| Red | 1 byte |
| Green | 1 byte |
| Blue | 1 byte |
根据调色板信息,图像数据可以索引得到对应的24bit RGB颜色信息。
二、案例分析
使用opencv-python得到一张10*10的PNG图像以便于分析:
import cv2
img=cv2.imread("input.bmp")
img1=cv2.resize(img,(10,10))
cv2.imwrite("output.png",img1)
(1)二进制文件分析
使用FlexHEX软件分析其组成,如图:

可以看到该png文件由四部分构成:
- 文件头——红色背景
- Chunk1——绿色背景
- Chunk2——白色背景
- Chunk3——蓝色背景
根据png数据块的知识,可以判断出三个chunk分别对应着IHDR(文件头数据块)、IDAT(图片信息数据块)和IEND(图片结束数据块),且本图为真彩色图片,没有调色板数据块。
(2)编程验证和元数据读取
使用C++编写程序,读上面的PNG文件。
主函数读取文件头和数据块
int main(


3348

被折叠的 条评论
为什么被折叠?



