所用图片有两张(一张只有IHDR,IDAT,IEND)(一张有IHDR,sRGB,gAMA,IDAT,IEND):
(一)PNG的文件结构是什么?
P N G PNG PNG图像格式由文件署名和数据块(chunk)组成。
(二)如何通过文件署名域来判断是不是PNG文件?
8字节的 P N G PNG PNG文件署名域用来识别该文件是不是 P N G PNG PNG文件。该域的值如下表所示:
十进制数 | 十六进制数 |
---|---|
137 | 89 |
80 | 50 |
78 | 4E |
71 | 47 |
13 | 0D |
10 | 0A |
26 | 1A |
10 | 0A |
下图所示是用二进制编辑器打开的第一张
P
N
G
PNG
PNG文件,可以看到前8个字节确实是表中所展现的8个字节。
(三)数据块如何分类?数据块的格式?
P
N
G
PNG
PNG文件有两种类型的数据块。关键数据块(critical chunk)和辅助数据块(ancillary chunks)。
每个数据块由4个部分组成。
名称 | 字节数 | 说明 |
---|---|---|
Length(长度) | 4 | 指定数据块中数据域的长度,其长度不超过(2^31-1)字节 |
Chunk Type Code(数据块类型码) | 4 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC | 4 | 存储用来检测是否有错误的循环冗余码 |
3.1 关键数据块(critical chunk)有哪些?分别起到什么作用?
P N G PNG PNG关键数据块中有4个标准数据块。
文件头数据块IHDR(header chunk)
I
H
D
R
IHDR
IHDR中包含
P
N
G
PNG
PNG文件中存储的图像数据的基本信息,并必须作为第一个数据块出现在
P
N
G
PNG
PNG数据流中,而且一个
P
N
G
PNG
PNG数据流中只能有一个
I
H
D
R
IHDR
IHDR,每一个
I
H
D
R
IHDR
IHDR的大小为
13
b
y
t
e
s
13 bytes
13bytes。
I
H
D
R
IHDR
IHDR的组成如下表所示:
名称 | 字节数 | 说明 |
---|---|---|
Width | 4 | 图像宽度,以像素为单位 |
Height | 4 | 图像高度,以像素为单位 |
Bit depth | 1 | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
Color Type | 1 | 颜色类型: 0:灰度图像,1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带 α \alpha α通道数据的灰度图像,8或16 6:带 α \alpha α通道数据的真彩色图像,8或16 |
Compression method | 1 | 压缩方法(LZ77)派生算法 |
Filter method | 1 | 滤波器方法 |
Interlace method | 1 | 隔行扫描方法: 0:非隔行扫描方法 1:Adam7(由Adam M.Costello开发的7遍隔行扫描方法) |
在第一张 P N G PNG PNG文件对应的二进制文件中查找对应位置的数据:
名称 | 数值 | 说明 |
---|---|---|
Length | 大小为 0x0D,与 I H D R IHDR IHDR的13字节对应,说明此数据块确实是 I H D R IHDR IHDR数据块 | |
Chunk Type Code | 表明该数据块是 I H D R IHDR IHDR数据块 | |
Width | 图像宽度为 0x1048 ,即4168像素 | |
Height | 图像高度为 0x1048,即4168像素 | |
Bit depth | 图像深度为8位 | |
Color Type | 颜色类型为 0x06, 即图像为带 α \alpha α通道数据的真彩色图像 | |
Compression method | 0x00 | |
Filter method | 0x00 | |
Interlace method | 0x00 | |
CRC | 9C C5 EB 42 |
调色版数据块PLTE(paltte chunk)
它包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
P
L
T
E
PLTE
PLTE数据块是定义图像的调色板信息,
P
L
T
E
PLTE
PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色 | 字节 | 意义 |
---|---|---|
Red | 1 | 0=黑,255=红 |
Green | 1 | 0=黑,255=绿 |
Blue | 1 | 0=黑,255=蓝 |
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致
P
N
G
PNG
PNG图像不合法。
本文的例子是带
α
\alpha
α通道数据的真彩色图像,没有调色板数据块。
图像数据块IDAT(image data chunk)
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
图像结束数据IEND(image trailer chunk)
它用来标记
P
N
G
PNG
PNG文件或者数据流已经结束,并且必须要放在文件的尾部.
00 00 00 00 49 45 4E 44 AE 42 60 82
在第一张图片对应的二进制文件中查看最末的12个字节,结果如下图所示:
和上文所述的
I
E
N
D
IEND
IEND的数值一致。
除了表示数据块开始的IHDR必须放在最前面,表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制.
3.2 辅助数据块(ancillary chunks)有哪些?请详细分析其中几个。
P N G PNG PNG文件格式规范规定的10个辅助数据块为:
- 背景颜色数据块bkGD(background color)
- 基色和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是只当R=G=B=最大值时在显示器上产生的白色度
- 图像γ数据块gAMA(image gamma)
- 图像直方图数据块hIST(image histogram)
- 物理像素尺寸数据块pHYs(physical pixel dimensions)
- 样本有效位数据块sBIT(significant bits)
- 文本信息数据块tEXt(textual data)
- 图像最后修改时间数据块tIME (image last-modification time)。
- 图像透明数据块tRNS(transparecy)
- 压缩文本数据块zTXt (compressed textual data)
图片来源:PNG 文件结构
sRGB数据块(Standerd RGB colour space)
s
R
G
B
sRGB
sRGB的Chunk Type Code为:115 82 71 66
s
R
G
B
sRGB
sRGB的信息由一个字节组成:
名称 | 字节数 | 说明 |
---|---|---|
Rendering intent | 1 | 0:Perceptual 适用于喜欢以输出色域为佳,而以色度精度为代价的图像,例如照片。 1:Relative colorimetric 用于需要颜色外观匹配(相对于输出设备白点)的图像,例如徽标。 2:Saturation 适用于希望保留饱和度但以色相和亮度为代价的图像,例如图表和图形。 3:Absolute colorimetric 用于需要保留绝对色度的图像,例如用于其他输出设备的图像预览(校样)。 |
通常在
s
R
G
B
sRGB
sRGB的后面同时写入
g
A
M
A
gAMA
gAMA数据块(有时候也会有
c
H
R
M
cHRM
cHRM数据块),为了使得一些不能正确解码
s
R
G
B
sRGB
sRGB数据块的
P
N
G
PNG
PNG解码器正确解码。跟在
s
R
G
B
sRGB
sRGB数据块后面的
g
A
M
A
gAMA
gAMA数据块和
c
H
R
M
cHRM
cHRM的正确写法应该如下表所示:(图片来源:11.3.3.5 sRGB Standard RGB colour space
打开第二张图对应的二进制文件:
名称 | 数据 | 说明 |
---|---|---|
Length | 数值为1,符合sRGB的标准 | |
Chunk Type Code | 是上文所述的4个字节 | |
Rendering intent | 数值为0,适用于喜欢以输出色域为佳,而以色度精度为代价的图像,例如照片。 | |
CRC | 循环冗余校验码 |
后面跟着的 g A M A gAMA gAMA数据块如下表所示:
名称 | 数据 | 说明 |
---|---|---|
Length | 说明数据有4个字节 | |
Chunk Type Code | 是gAMA的ASCII码 | |
Data | 符合前面表述的45455数值 | |
CRC | 循环校验码 |
pHYs数据块(physical pixel dimensions)
p
H
Y
s
pHYs
pHYs的Chunk Type Code为:112 72 89 115
p
H
Y
s
pHYs
pHYs的信息由以下三部分组成:
名称 | 字节数 |
---|---|
Pixels per unit,X axis | 4 |
Pixels per unit,Y axis | 4 |
Unit specifier | 1 |
其中,Unit specifier是这样定义的:
数值 | 说明 |
---|---|
0 | unit is unknown |
1 | unit is the metre |
打开第二张图对应的二进制文件:
名称 | 数值 | 说明 |
---|---|---|
Length | 9个字节,符合pHYs的标准 | |
Chunk Type Code | 是pHYs的ASCII码的数值 | |
X axis | 0x1274 | |
Y axis | 0x1274 | |
Unit specifier | 1: unit is the metre | |
CRC | 循环校验码 |