??xml version="1.0" encoding="utf-8" standalone="yes"?>
00000010h: 00 00 00 CE 00 00 00 CE 08 02 00 00 00 F9 7D AA ; ...?..?....鶀?
00000020h: 93 00 00 00 09 70 48 59 73 00 00 0A 75 00 00 0A ; ?...pHYs...u...
00000030h: 75 01 4A 25 DD FD 00 00 0C 91 49 44 41 54 78 9C ; u.J%?..慖DATx?
00000040h: ED 9D D9 96 DC 2A 0C 45 A9 AC FC FF 2F D7 7D 70 ; 頋贃?.E?/讅p
00000050h: C7 97 66 10 9A 98 CF 7E C8 EA 54 95 6D 86 83 24 ; 菞f.D蟸汝T昺唭$
00000060h: 04 B6 3F DF EF 37 00 D0 9F 3F B3 0B 00 6E 01 52 ; .??.??.n.R
00000070h: 03 83 F8 3B BB 00 AB F2 F9 98 0E 47 58 92 01 A9 ; .??鶚.GX??
89 50 4E 47 0D 0A 1A 0A 是PNG头部|名域,表示q是一个PNG囄
00 00 00 0D 描述IHDR头部的大?br />49 48 44 52 ?font size="2">Chunk Type Code, q里Chunk Type Code=IHDR
00 00 00 CE 00 00 00 CE 08 02 00 00 00 描述了Chunk DataQ它是可变长度数?font size="2">Q?font size="3">00 00 00 0D 定义了长度ؓ13个BytesQ所?q里Q你看到?3个字?/font>)
F9 7D AA 93 是对IHDR的CRC校验
紧接着下面的就是pHys数据块,原理也是一栗?br />
PNG格式
PNG?0世纪90q代中期开始开发的囑փ文g存储格式Q其目的是企图替代GIF和TIFF文g格式Q同时增加一些GIF文g格式所不具备的Ҏ(gu)。流式网l图形格?Portable Network Graphic FormatQPNG)名称来源于非官方的“PNG's Not GIF”,是一U位图文?bitmap file)存储格式Q读成“ping”。PNG用来存储灰度囑փӞ灰度囑փ的深度可多到16位,存储彩色囑փӞ彩色囑փ的深度可多到48位,q且q可存储多到16位的通道数据。PNG使用从LZ77z的无损数据压~算法?/font>
PNG文g格式保留GIF文g格式的下列特性:
使用彩色查找表或者叫做调色板可支?56U颜色的彩色囑փ?
式?写性能(streamability)Q图像文件格式允许连l读出和写入囑փ数据Q这个特性很适合于在通信q程中生成和昄囑փ?
逐次D昄(progressive display)Q这U特性可使在通信链\上传输图像文件的同时在l端上显C图像,把整个轮廓显C出来之后逐步昄囑փ的细节,也就是先用低分L率显C图像,然后逐步提高它的分L率?
透明?transparency)Q这个性能可囑փ中某些部分不昄出来Q用来创Z些有特色的图像?
辅助信息(ancillary information)Q这个特性可用来在图像文件中存储一些文本注释信息?
独立于计机软硬件环境?
使用无损压羃?/font>
PNG文g格式中要增加下列GIF文g格式所没有的特性:
每个像素?8位的真彩色图像?
每个像素?6位的灰度囑փ?
可ؓ灰度囑֒真彩色图d通道?
d囑փ的γ信息?
使用循环冗余?cyclic redundancy codeQCRC)损害的文g?
加快囑փ昄的逐次D昄方式?
标准的读/写工具包?
可在一个文件中存储多幅囑փ?/font>
文gl构
PNG囑փ格式文g(或者称为数据流)׃?字节的PNG文g|名(PNG file signature)域和按照特定l构l织?个以上的数据?chunk)l成?/font>
PNG定义了两U类型的数据块,一U是UCؓ关键数据?critical chunk)Q这是标准的数据块,另一U叫做辅助数据块(ancillary chunks)Q这是可选的数据块。关键数据块定义?个标准数据块Q每个PNG文g都必d含它们,PNGd软g也都必须要支持这些数据块。虽然PNG文g规范没有要求PNG~译码器对可选数据块q行~码和译码,但规范提倡支持可选数据块?/font>
(1) PNG文g|名?/p>
8字节的PNG文g|名域用来识别该文g是不是PNG文g。该域的值是Q?/p>
十进制数 | 137 | 80 | 78 | 71 | 13 | 10 | 26 | 10 |
十六q制?/font> | 89 | 50 | 4e | 47 | 0d | 0a | 1a | 0a |
(2) 数据块的l构
每个数据块都p6-07所C的?个域l成?/font>
?-07 PNG文g数据块的l构
名称 |
字节?/p> |
说明 |
Length(长度) | 4字节 | 指定数据块中数据域的长度Q其长度不超q?br />(231Q?)字节 |
Chunk Type Code(数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)l成 |
Chunk Data(数据块数? | 可变长度 | 存储按照Chunk Type Code指定的数?/font> |
CRC(循环冗余? | 4字节 | 存储用来是否有错误的@环冗余码 |
在表6-07中,CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计得到的。CRC具体法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多式q行计算Q?/font>
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
数据块结?/p>
1. 关键数据?/p>
关键数据块中?个标准数据块是:
(1) 文g头数据块IHDR(header chunk)Q它包含有PNG文g中存储的囑փ数据的基本信息,q要作ؓW一个数据块出现在PNG数据中Q而且一个PNG数据中只能有一个文件头数据块?/font>
文g头数据块?3字节l成Q它的格式如?-08所C?/font>
?-08 PNG文g头键数据块的l构
域的名称 |
字节?/p> |
说明 |
Width | 4 bytes | 囑փ宽度Q以像素为单?/font> |
Height | 4 bytes | 囑փ高度Q以像素为单?/font> |
Bit depth | 1 byte |
囑փ深度Q?br />索引彩色囑փQ?Q?Q?? 灰度囑փQ?Q?Q?Q??6 真彩色图像:8?6 |
ColorType | 1 byte |
颜色cdQ?br />0Q灰度图? 1Q?Q?Q??6 2Q真彩色囑փQ??6 3Q烦引彩色图像,1Q?Q??
4Q带通道数据的灰度图像,8?6 |
Compression method | 1 byte | 压羃Ҏ(gu)(LZ77z法) |
Filter method | 1 byte | 滤L器方?/font> |
Interlace method | 1 byte |
隔行扫描Ҏ(gu)Q?/font>
0Q非隔行扫描
1Q?Adam7(由Adam M. Costello开发的7 |
(2) 调色板数据块PLTE(palette chunk)Q它包含有与索引彩色囑փ((indexed-color image))相关的彩色变换数据,它仅与烦引彩色图像有养I而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据也可以有调色板数据块,目的是便于非真彩色显C程序用它来量化囑փ数据Q从而显C囑փ。调色板数据块结构如?-09所C?/font>
?-09 调色板数据块l构
域的名称 |
字节?/p> |
说明 |
Red | 1 byte | 0 = 黑,255 = U?/font> |
Green |
">
0 = 黑,255 = l?/font> |
|
Blue | 1 byte | 0 = 黑,255 = ?/font> |
调色板实际是一个彩色烦引查找表Q它的表Ҏ(gu)目可以是1?56中的一个数Q每个表Ҏ(gu)3字节Q因此调色板数据块所包含的最大字节数?68?/font>
(3) 囑փ数据块IDAT(image data chunk)Q它存储实际的数据,在数据流中可包含多个q箋序的图像数据块?/font>
(4) 囑փl束数据IEND(image trailer chunk)Q它用来标记PNG文g或者数据流已经l束Qƈ且必要攑֜文g的尾部?/font>
除了表示数据块开始的IHDR必须攑֜最前面Q?表示PNG文gl束的IEND数据块放在最后面之外Q其他数据块的存N序没有限制?/font>
2. 辅助数据?/p>
PNG文g格式规范制定?0个辅助数据块是:
(1) 背景颜色数据块bKGD(background color)?/font>
(2) 和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是指当RQGQBQ最大值时在显C器上生的白色度?/font>
(3) 囑փ数据块gAMA(image gamma)?/font>
(4) 囑փ直方图数据块hIST(image histogram)?/font>
(5) 物理像素寸数据块pHYs(physical pixel dimensions)?/font>
(6) h有效位数据块sBIT(significant bits)?/font>
(7) 文本信息数据块tEXt(textual data)?/font>
(8) 囑փ最后修Ҏ(gu)间数据块tIME (image last-modification time)?/font>
(9) 囑փ透明数据块tRNS (transparency)?/font>
(10) 压羃文本数据块zTXt (compressed textual data)?/font>
3. 数据块摘?/p>
关键数据块、辅助数据块和专用公共数据块(special-purpose public chunks)l合在表6-10中?/font>
?-10 PNG文g格式中的数据?/font>
数据块符?/p> |
数据块名U?/p> |
多数据块 |
可选否 |
位置限制 |
||
IHDR | 文g头数据块 |
?/p> |
?/p> |
W一?/font> | ||
cHRM | 和白色点数据?/font> |
?/p> |
?/p> |
在PLTE和IDAT之前 | ||
gAMA | 囑փ数据?/font> |
?/p> |
?/p> |
在PLTE和IDAT之前 | ||
sBIT | h有效位数据块 |
?/p> |
?/p> |
在PLTE和IDAT之前 | ||
PLTE | 调色板数据块 |
?/p> |
?/p> |
在IDAT之前 | ||
bKGD | 背景颜色数据?/font> |
?/p> |
?/p> |
在PLTE之后IDAT之前 | ||
hIST | 囑փ直方图数据块 |
?/p> |
?/p> |
在PLTE之后IDAT之前 | ||
tRNS | 囑փ透明数据?/font> |
?/p> |
?/p> |
在PLTE之后IDAT之前 | ||
oFFs | (专用公共数据? |
?/p> |
?/p> |
在IDAT之前 | ||
pHYs | 物理像素寸数据?/font> |
?/p> |
?/p> |
在IDAT之前 | ||
sCAL | (专用公共数据? |
?/p> |
?/p> |
在IDAT之前 | ||
IDAT | 囑փ数据?/font> |
?/p> |
?/p> |
与其他IDATq箋 | ||
tIME | 囑փ最后修Ҏ(gu)间数据块 |
?/p> |
?/p> |
无限?/font> | ||
tEXt | 文本信息数据?/font> |
?/p> |
?/p> |
无限?/font> | ||
zTXt | 压羃文本数据?/font> |
?/p> |
?/p> |
无限?/font> | ||
fRAc | (专用公共数据? |
?/p> |
?/p> |
无限?/font> | ||
gIFg | (专用公共数据? |
?/p> |
?/p> |
无限?/font> | ||
gIFt | (专用公共数据? |
?/p> |
?/p> |
无限?/font> | ||
gIFx | (专用公共数据? |
?/p> |
?/p> |
无限?/font> | ||
IEND | 囑փl束数据 |
?/p> |
?/p> |
最后一个数据块 |
tEXt和zTXt数据块中的标准关键字Q?/p>
Title |
囑փ名称或者标?/p> |
Author |
囑փ作者名 |
Description |
囑փ说明 |
Copyright |
版权声明 |
CreationTime |
原图创作旉 |
Software |
创作囑փ使用的Y?/p> |
Disclaimer |
弃权 |
Warning |
囑փ内容警告 |
Source |
创作囑փ使用的设?/p> |
Comment |
各种注释 |
Type | Description | |
Character | 文gcdQ通常是BM开?/td> | |
32-bit Int | 文g大小Q单位byte | |
16-bit Int | 保留 | |
16-bit Int | 保留 | |
32-bit Int | 位图内容(A.4)开始的字节偏移 |
Type | Description | |
32-bit Int | 信息头的大小(字节? | |
32-bit Int | 位图的宽度(?024像素Q?/td> | |
32-bit Int | 位图的高??68像素) | |
16-bit Int | Number of bitplanes (should be 1) | |
16-bit Int | 用多个位去描述一个像?1, 4, 8, or 24) | |
32-bit Int | 使用的压~类?/td> | |
32-bit Int | 如果使用了压~,需要指定位囄实际大小 | |
32-bit Int | 每米的水q_素的数量(用于攑֤~小) | |
32-bit Int | 每米的垂直像素的数量(用于攑֤~小) | |
32-bit Int | 实际用到的颜色数?/td> | |
32-bit Int | 较重要颜色的数量Q用于减颜色数Q?/td> |