欢迎查看系列博客:
《PNG文件格式》(一)PNG文件概述 《PNG文件格式》(二)PNG文件格式分析
摘自:
中文PNG格式说明:dev.gameres.com
PNG文件格式白皮书:www.w3.org
LZ77算法的JAVA实现:jazzlib.sourceforge.net
LZ77算法的JAVA实现,包括J2ME版本:www.jcraft.com
===============================正文=======================================
下面这个图片是我们工程中一个图片,tableViewcell的背景图
为了方便实例中,查看png术语,笔者再次把数据块的图放到这里
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字节 | 存储用来检测是否有错误的循环冗余码 |
使用UltraEdit打开后,如下:
可以看到,选中的头8个字节即为PNG文件的标识。
接下来的地方就是IHDR数据块了:
[length] 00 00 00 0D 说明IHDR头块长为13
[Chunk Type Code] 49 48 44 52 IHDR标识(就是ASIIC值)
[Chunk Data]:下面13个字节,分别如下:
(0-3). 00 00 00 28 图像的宽,40像素
(4-7). 00 00 00 28 图像的高,40像素
(08). 08 色深,2^8 = 256,即这是一个真彩色图像
(09). 06 颜色类型,带α通道数据的真彩色图像
(10). 00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
(11). 00 滤波器方法
(12). 00 非隔行扫描
[CRC]: 8C FE B8 6D CRC校验
pHYS物理像素尺寸数据。
x轴和y轴都是0B13
Profile name | 1-79 bytes (character string) |
Null separator | 1 byte (null character) |
Compression method | 1 byte |
Compressed profile | n bytes |
上面是cHRM信息,基色和白色点数据块,cHRM的结构如下:
White point x | 4 bytes |
White point y | 4 bytes |
Red x | 4 bytes |
Red y | 4 bytes |
Green x | 4 bytes |
Green y | 4 bytes |
Blue x | 4 bytes |
Blue y | 4 bytes |
上面的IHDR说明了,该png是一个32为带有alpha通道的图片。每4个字节排列一下:
[White point x] 00 00 7A 25
[White point y] 00 00 80 83
[Red x] 00 00 F9 FF
[Red y] 00 00 80 E9
[Green x] 00 00 75 30
[Green y] 00 00 EA 60
[Blue x] 00 00 3A 98
[Blue y] 00 00 17 6F
以上选中部分是IDAT数据块
[length] 00 00 00 54 说明IDAT头块长为84
[Chunk Type Code] 49 44 41 54 IDAT标识(就是ASIIC值)
[Chunk Data]:包含了54个字节,78,DA...压缩的数据,LZ77派生压缩方法
[CRC]: 5E F3 F1 8A 为CRC校验
原文地址:http://blog.csdn.net/hherima/article/details/45848171