码迷,mamicode.com
首页 > 其他好文 > 详细

《PNG文件格式》(三)PNG文件实例剖析

时间:2015-05-25 14:42:41      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:png   alpha   

欢迎查看系列博客:

《PNG文件格式》(一)PNG文件概述     《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打开后,如下:

[00000000~00000007]

技术分享

可以看到,选中的头8个字节即为PNG文件的标识。
接下来的地方就是IHDR数据块了:

[00000008~00000020]

技术分享

[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校验

00000021~00000035:

技术分享

pHYS物理像素尺寸数据。

x轴和y轴都是0B13

00000036~00000A8E:

技术分享
技术分享

这里是iCCP信息,iCCP的组成如下:
Profile name 1-79 bytes (character string)
Null separator 1 byte (null character)
Compression method 1 byte
Compressed profile n bytes

上面的iCCP的Profile Name为:Photoshop ICC profile
Compression method为00,因为目前在本国际标准中定义的唯一的压缩方法是zlib,即00

00000A8F~00000ABA:

技术分享

上面是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

00000ABB~00000B1A:

技术分享
以上选中部分是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校验

00000B1B~00000B20:

技术分享
IEND数据块,这部分正如上所说,通常都应该是 00 00 00 00 49 45 4E 44 AE 42 60 82

总结

        至此,我们已经能够从一个PNG文件中识别出各个数据块了。由于PNG中规定除关键数据块外,其它的辅助数据块都为可选部分,因此,有了这个标准后,我们可以通过删除所有的辅助数据块来减少PNG文件的大小。(当然,需要注意的是,PNG格式可以保存图像中的层、文字等信息,一旦删除了这些辅助数据块后,图像将失去原来的可编辑性。)
        其实,我们可以通过改变调色板的色值来完成一些又趣的事情,比如说实现云彩/水波的流动效果,实现图像的淡入淡出效果等等,在此,给出一个链接给大家看也许更直接:http://blog.csdn.net/flyingghost/archive/2005/01/13/251110.aspx

    如上说过,IDAT数据块是使用了LZ77压缩算法生成的,由于受限于手机处理器的能力,因此,如果我们在生成IDAT数据块时仍然使用LZ77压缩算法,将会使效率大打折扣,因此,为了效率,只能使用无压缩的LZ77算法,关于LZ77算法的具体实现,此文不打算深究,如果你对LZ77算法的JAVA实现有兴趣,可以参考以下两个站点:
http://jazzlib.sourceforge.net/
http://www.jcraft.com/jzlib/index.html

《PNG文件格式》(三)PNG文件实例剖析

标签:png   alpha   

原文地址:http://blog.csdn.net/hherima/article/details/45848171

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!