png图片格式分析
来源:互联网 发布:python createelement 编辑:程序博客网 时间:2024/06/05 21:01
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
图像结束数据
否
否
最后一个数据块
Png图片数据块列表
Png格式是由四个关键数据块和一些辅助数据块组成,四个关键数据块是必需的。有了它们就可以组成一张png图片,这四个关键数据块就是:
文件头数据块(IHDR)、调色板数据块(PLTE)、图象数据块(IDAT)、图象结束数据块(IEND)。为了使图象的背景色透明,获得更好的效果,我建议还要将tRNS这个数据块加上。原来我在手机上就用四个关键数据块合成一张图片,放到手机上背景色不透明,效果不好,加上tRNS这个数据块就背景色透明。
每个png图片的数据块的结构都是一样的。结构图如下:
名称
字节数
说明
Length (长度)
4字节
指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code (数据块类型码)
4字节
数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data (数据块数据)
可变长度
存储按照Chunk Type Code指定的数据
CRC (循环冗余检测)
4字节
存储用来检测是否有错误的循环冗余码
CRC域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。
每个数据块都是由这些数据域组成的。
IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
对于一个PNG文件来说,png图片的标志位:
十进制数
137 80 78 71 13 10 26 10
十六进制数
89 50 4E 47 0D 0A 1A 0A
文件头数据块由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
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色
字节
意义
Red
1 byte
0 = 黑色, 255 = 红
Green
1 byte
0 = 黑色, 255 = 绿色
Blue
1 byte
0 = 黑色, 255 = 蓝色
因此,调色板的长度应该是3的倍数。
并不是所有的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。
上面是png格式图片的四个关键数据块, 暂时分析到这。
- png图片格式分析
- png图片格式分析
- png图片格式分析
- 分析PNG图片格式——数据块
- Png图片格式
- GIF、JPEG 和 PNG 是三种最常见的图片格式分析。
- 常见图片格式简单分析总结--JPG、PNG、GIF、BMP
- galleryfinal 不支持png图片格式
- 图片格式分析
- PNG文件结构(PNG图片格式)详解
- PNG文件结构(PNG图片格式)详解
- PNG文件结构(PNG图片格式)详解 .
- .9.png 图片格式的使用
- Xcode报png图片格式错误
- 加载多种图片格式(gif,jpg,png.bmp)
- iPhone中Png图片格式的研究
- iPhone中Png图片格式的研究
- iPhone中Png图片格式的研究
- Linux下编写动态链接库,如何定义一个init和finalize的方法?
- hadoop伪分布模式下的编程步骤
- 抽象的数码艺术-分形艺术
- Application Request Route详解
- Android 应用程序异常信息捕获发送至服务器
- png图片格式分析
- 判断手机内存卡是否存在
- Android开发规范之编码规范
- [最短路] hdu 4166
- UBoot从ROM拷贝到RAM
- 使用Google Page Speed来分析改进页面的载入时间
- 模板下载网站收集
- ARM下书写位置无关的代码
- 用bitmap减少hash算法所用空间