PNG文件格式分析

PNG简介

png是一种无损压缩的位图片形格式。其设计目的是为了替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。

  png格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性。png使用从LZ77派生的无损数据压缩算法,由于它压缩比高,生成文件体积小,一般被应用于JAVA程序、网页或S60程序中。
 

PNG文件结构

PNG文件一般由两大部分组成:

 ·8字节的PNG文件署名(PNG file signature)域
 ·按照特定结构组织的3个以上的数据块(chunk)

标准PNG文件结构

文件署名域 数据块 ······ 数据块

一.文件署名域

作用:用来识别该文件是否为PNG文件

文件头总是用固定的字节来描述的,共8个字节

十进制数 十六进制数
137 80 78 71 1310 26 10 89 50 4E 47 0D 0A 1A 0A

二.数据块

PNG定义了两种类型的数据块

1.关键数据块(critical chunk),标准的数据块
2.辅助数据块(ancillary chunks),可选的数据块

 四种关键数据块

文件头数据块IHDR(header chunk) 它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
调色板数据块PLTE(palette chunk) 它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
图像数据块IDAT(image data chunk) 它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
图像结束数据IEND(image trailer chunk) 它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

十种辅助数据块

背景颜色数据块bKGD(background color)
基色和白色度数据块cHRM(primary chromaticities and white point)
图像γ数据块gAMA(image gamma)
图像直方图数据块hIST(image histogram)
物理像素尺寸数据块pHYs(physical pixel dimensions)
样本有效位数据块sBIT(significant bits)
文本信息数据块tEXt(textual data)
图像最后修改时间数据块tIME (image last-modification time)
图像透明数据块tRNS (transparency)
压缩文本数据块zTXt (compressed textual data)

​​​​​​​​​​​​​​

PNG文件格式中的数据块
数据块符号 数据块名称 多数据块 可选否 位置限制
IHDR 文件头数据块 第一块
cHRM 基色和白色点数据块 在PLTE和IDAT之前
gAMA 图像γ数据块 在PLTE和IDAT之前
sBIT 样本有效位数据块 在PLTE和IDAT之前
PLTE 调色板数据块 在IDAT之前
bKGD 背景颜色数据块 在PLTE之后IDAT之前
hIST 图像直方图数据块 在PLTE之后IDAT之前
tRNS 图像透明数据块 在PLTE之后IDAT之前
oFFs (专用公共数据块) 在IDAT之前
pHYs 物理像素尺寸数据块 在IDAT之前
sCAL (专用公共数据块) 在IDAT之前
IDAT 图像数据块 与其他IDAT连续
tIME 图像最后修改时间数据块 无限制
tEXt 文本信息数据块 无限制
zTXt 压缩文本数据块 无限制
fRAc (专用公共数据块) 无限制
gIFg (专用公共数据块) 无限制
gIFt (专用公共数据块) 无限制
gIFx (专用公共数据块) 无限制
IEND 图像结束数据 最后一个数据块

数据块结构

名称 字节数 说明
Length (长度) 4字节 指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code (数据块类型码) 4字节 数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data (数据块数据) 可变长度 存储按照Chunk Type Code指定的数据
CRC (循环冗余检测) 4字节 存储用来检测是否有错误的循环冗余码

关键数据块的结构

IHDR:它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

文件头数据块共有13个字节:

域的名称 字节数 说明
Width 4 bytes 图像宽度,以像素为单位
Height 4 bytes 图像高度,以像素为单位
Bit depth 1 byte 图像深度: 
索引彩色图像:1,2,4或8 
灰度图像:1,2,4,8或16 
真彩色图像:8或16
ColorType 1 byte 颜色类型:
0:灰度图像, 1,2,4,8或16 
2:真彩色图像,8或16 
3:索引彩色图像,1,2,4或8 
4:带α通道数据的灰度图像,8或16 
6:带α通道数据的真彩色图像,8或16
Compression method 1 byte 压缩方法(LZ77派生算法)
Filter method 1 byte 滤波器方法
Interlace method 1 byte 隔行扫描方法:
0:非隔行扫描 
1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

PLTE:它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前

​​​​​​​PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:

颜色 字节 意义
Red 1 byte 0 = 黑色, 255 = 红
Green 1 byte 0 = 黑色, 255 = 绿色
Blue 1 byte 0 = 黑色, 255 = 蓝色

因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。

对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。

真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

IDAT:图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

IEND:图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

00 00 00 00 49 45 4E 44 AE 42 60 82

不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
 

实例分析

使用visual studio 二进制编辑器打开png格式文件

文件头

前8个字节为 

89 50 4E 47 0D 0A 1A 0A

IHDR

域的名称 字节数 实例数据 说明
Length 4 bytes 数据块长度为13
Chunk Type Code 4 bytes wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== IHDR标识
width 4 bytes 宽度为33795像素
Height 4 bytes 高度为32513像素
Bit depth 1 byte 图像深度为8位
ColorType 1 byte 颜色类型为6,即带α通道数据的真彩色图像
Compression method 1 byte 无压缩
Filter method 1 byte 无滤波
Interlace method 1 byte 非隔行扫描
CRC 4 bytes 循环冗余码

 pHYs

 

名称 实际结果 说明
Length 数据块长度为9
Chunk Type Code 数据块类型为pHYs
Chunk Data 实际数据

 IDAT

名称 实际结果 说明
Length 数据块长度为8192
Chunk Type Code 数据块类型为IDAT
Chunk Data 实际数据

 IEND

 

 

与上描述一致

参考文献

[1]PNG文件分析

 

你可能感兴趣的:(数据压缩作业,c#)