【数据压缩】PNG格式文件分析

一、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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值