PNG图片格式分析格式
PNG文件格式
- PNG总体格式
一个PNG文件是由8字节的文件标志和按照特定结构组织的3个以上的数据块(chunk)构成的,结构如所示。具体结构如图1、图2所示
PNG文件结构
图1 包含调色板数据块(PLTE)的PNG图像文件格式
图2 不包含调色板数据块(PLTE)的PNG图像文件格式
(注:1表示:只有1个;+表示:1个或多个;?表示:0个或1个;*表示:0个或多个;|表示:2选1)
2.PNG文件标志
对于一个PNG文件来说,其文件头总是由位固定的字节来描述的,8字节的PNG文件标志用来识别该文件是不是PNG文件。该域的值如表1所示。
十进制数 |
137 |
80 |
78 |
71 |
13 |
10 |
26 |
10 |
十六进制数 |
89 |
50 |
4E |
47 |
0D |
0A |
1A |
0A |
表1
其中第一个字节Ox89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。
3.PNG数据块
PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成,格式如表2所示。
字 段 名 |
大小(单位:字节) |
描 述 |
Length(长度) |
4 |
指定数据块中的数据长度 |
Chunk Type Code(数据块类型码) |
4 |
数据块类型,例如 IHDR、PLTE、IDAT等 |
Chunk Data(数据块数据) |
Length |
存储数据 |
CRC(循环冗余检测) |
4 |
循环冗余码 |
表2
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块;另一种叫做辅助数据块(ancillary chunk),这是可选的数据块. 关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们。
关键数据块(critical chunks)由4部分组成:文件头数据块(IHDR)、调色板数据块(PLTE)、图像数据块(IDAT)和图像结束数据(IEND),其中调色板数据块(PLTE)根据图像的色深可选。关键数据块组值顺序如表3所示。
数据块名称 |
允许多个数据块 |
位 置 |
文件头数据块(IHDR) |
不允许 |
第一个数据块 |
调色板数据块(PLTE) |
不允许 |
第二个数据块,可选 |
图像数据块(IDAT) |
允许 |
如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE),则时第二个数据块。如果有多个图像数据块,则必须按图像数据连续存储 |
图像结束数据(IEND) |
不允许 |
最后一个数据块 |
表3
辅助数据块(ancillary chunks)一共有14个,这些辅助数据块包含了很多信息,辅助数据块不是必须包含的。辅助数据块组值顺序如表4所示。(具体每种数据块格式可以参考:https://www.w3.org/TR/PNG/index-noobject.html#11sRGB)
数据块名称 |
允许多个数据块 |
位 置 |
基色和白色点数据块(cHRM) |
不允许 |
在PLTE和IDAT之前 |
图像γ数据块(gAMA) |
不允许 |
在PLTE和IDAT之前 |
ICCP(iCCP) |
允许 |
在PLTE之后IDAT之前如果有iCCP,则无sRGB |
样本有效位数据块(sBIT) |
不允许 |
在PLTE和IDAT之前 |
标准RPG颜色(sRGB) |
不允许 |
在PLTE之后IDAT之前如 果有sRGB,则无iCCP |
背景颜色数据块(bKGD) |
不允许 |
在PLTE之后IDAT之前 |
图像直方图数据块(hIST) |
不允许 |
在PLTE之后IDAT之前 |
图像透明数据块(tRNS) |
不允许 |
在PLTE之后IDAT之前 |
物理像素尺寸数据块(pHYs) |
不允许 |
在IDAT之前 |
建议调色板(sPLT) |
允许 |
在IDAT之前 |
图像最后修改时间数据块(tIME) |
不允许 |
无限制 |
国际文本数据(iTXt) |
允许 |
无限制 |
文本信息数据块(tEXt) |
允许 |
无限制 |
压缩文本数据块(zTXt) |
允许 |
无限制 |
表4
关键数据块
1)头文件数据块IHDR(header chunk)
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13字节组成,它的格式如表5所示。
域的名称 |
字节数 |
说明 |
Width |
4 bytes |
图像宽度,以像素为单位 |
Height |
4 bytes |
图像高度,以像素为单位 |
Bit depth |
1 byte |
图像深度: |
ColorType |
1 byte |
颜色类型: 4:带α通道数据的灰度图像,8或16 |
Compression method |
1 byte |
压缩方法(LZ77派生算法) |
Filter method |
1 byte |
滤波器方法 |
Interlace method |
1 byte |
隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7 |
表5
2)调色板数据块PLTE(palette chunk)
它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表6所示。
调色板实际是一个彩色索引查找表,它的表项数目可以是1~256中的一个数,每个表项有3字节,因此调色板数据块所包含的最大字节数为768。
域的名称 |
字节数 |
字节数 |
Red |
1 byte |
0 = 黑,255 = 红 |
Green |
1 byte |
0 = 黑,255 = 绿 |
Blue |
1 byte |
0 = 黑,255 = 蓝 |
表6
3)图像数据块IDAT(image data chunk)
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
4)图像结束数据块IEND(image trailer chunk)
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
除了表示数据块开始的IHDR必须放在最前面, 表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。
- 举例分析
如图3是一个5*3的.png格式的图片的二进制形式。
图3
如图4前八个字节是文件标志
图4
1.文件头数据块IHDR
接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5所示。
图5
表7表示图像文件中文件头数据块(IHDR)的各字段含义。
十六进制值 |
描 述 |
00 00 00 0D |
文件头的数据长度,00 00 00 0D=13 |
49 48 44 52 |
数据块的标志类型,49 48 44 52的ASCII值等于IHDR |
00 00 00 05 |
图像宽度:5 |
00 00 00 03 |
图像高度:3 |
08 |
色深,表示2的8次方256色 |
06 |
表示带α通道数据的真彩色图像(没有PLTE) |
00 |
00表示使用Deflate压缩编码压缩图像数据 |
00 |
00表示为将来使用更好的压缩方法预留 |
00 |
表示隔行扫描 |
5B 36 C5 F8 |
表示CRC |
表7
2.标准RPG颜色数据块(sRGB)
图6为图像文件中标准RPG颜色数据块(sRGB),表8所示为图像文件中标准RPG颜色数据块(sRGB)中各字段的含义。
图6
十六进制值 |
描 述 |
00 00 00 01 |
数据块的长度,00 00 00 01 =1 |
73 52 47 42 |
数据块类型标志,73 52 47 42的ASCII值等于sRGB |
00 |
感知法:以牺牲色度精度为代价,更倾向于良好适应输出设备色域的图像,例如照片 |
AE CE 1C E9 |
CRC值 |
3.图像γ数据块(gAMA)
图7为图像文件中gAMA数据块,表9所示为图像文件中gAMA数据块中各字段的含义。
图7
十六进制值 |
描 述 |
00 00 00 04 |
gAMA数据块的长度,00 00 00 04 = 4 |
67 41 4D 41 |
数据块类型标志,67 41 4D 41的ASCII值等于gAMA |
00 00B1 8F |
gamma校正信息 |
7C F8 51 93 |
CRC值 |
表9
4.物理像素尺寸数据块(pHYs)
图8为图像文件中物理像素尺寸数据块(pHYs),表10所示为图像文件中物理像素尺寸数据块(pHYs)中各字段的含义。
图 8
十六进制值 |
描 述 |
00 00 00 09 |
物理像素尺寸数据块的长度,00 00 00 09 =9 |
70 48 59 73 |
数据块类型标志,70 48 59 73的ASCII值等于pHYs |
00 00 19 D6 |
x轴上每米像素的数量,00 00 19 D6= 6614,即每米6614个像素 |
00 00 19 D6 |
y轴上每米像素的数量,00 00 19 D6 = 6614,即每米6614个像素 |
01 |
Meter=1,将单位定义为米 |
18 D1 CA ED |
CRC值 |
表10
5.图像数据块IDAT
图9为图像文件中图像数据块IDAT,表11所示为图像文件中图像数据块IDAT中各字段的含义。
图9
十六进制值 |
描 述 |
00 00 00 4A |
IDAT数据块的长度,00 00 00 4A = 76 |
49 44 41 54 |
数据块类型标志,49 44 41 54的ASCII值等于IDAT |
18~47 |
图像数据块,一共76字节,使用变种的LZ77压缩过 |
3E 5D 9F 08 |
CRC值 |
表11
6.图像结束数据块IEND(image trailer chunk)
图10为图像文件中图像数据块IDAT,表12所示为图像文件中图像数据块IDAT中各字段的含义。
图10
十六进制值 |
描 述 |
00 00 00 00 |
IEND数据块的长度,00 00 00 00 = 0 |
49 45 4E 44 |
数据块类型标志,49 45 4E 44的ASCII值等于IEND |
AE 42 60 82 |
CRC值 |
表12
PNG图片格式分析格式相关推荐
- NOKIA、MOTOROLA、SIMENS及ERICCSON铃声和图片格式分析(转)
NOKIA.MOTOROLA.SIMENS及ERICCSON铃声和图片格式分析 最近一直有些朋友们要求总结一下主流手机铃声和图片的问题,由于本人在这方面基本没有什么尝试,只能将有些朋友们发表过的东西总 ...
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...
- web前端入门学习 css(10)移动端布局(学到DPG格式图片与webp格式图片停了)
https://www.bilibili.com/video/BV14J4114768?p=390 代码:https://gitee.com/xiaoqiang001/html_css_materia ...
- jpg分辨率格式 jpg格式分析(转)
JPEG格式 格式:JFIF(JPEG档的交换格式) 压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1) 以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身 ...
- <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)
H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...
- Camera raw 12bit 图获取及格式分析(干货)
Camera raw 12bit 图获取及格式分析(干货) 1 写图像时候发现传数据有问题 2 12bit数据格式说明 1 写图像时候发现传数据有问题 方法一, 就是自己先创建 文件,然后通过 wri ...
- bitmap格式分析
位图(Bitmap)当然是最简单的,它Windows显示图片的基本格式,其文件扩展名为*.BMP.在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种格式的图片 ...
- 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )
文章目录 安卓直播推流专栏博客总结 一. RTMP 格式解析 二. 文件头 Header 分析 三. 标签 Tag 分析 四. 视频标签 Tag 数据分析 安卓直播推流专栏博客总结 Android R ...
- storm的消息格式分析
storm的消息格式分析 @(STORM)[storm] storm的消息格式分析 一ITuple接口 二core-storm的消息格式 三trident的消息格式 一trident中tuple的基本 ...
最新文章
- 用python做系统程序_新手小白做毕设,想用Python做一个系统,那么该学习哪方面的知识?...
- 3a三次方h c语言表达式,希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题...
- MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题
- 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
- redis和memcache的区别
- 解决iOS设备屏幕切换时页面造成的问题
- 验证手机号码归属地_手机号码归属地能否取消? 工信部回复了
- 世界上覆盖范围最广的计算机网络是 ( ),世界上覆盖范围最广的计算机网络是()。...
- PJAX全局无刷新的设置方法~
- CSS实现间隔线样式
- lesson 4 Show Messages in Messagebox
- Vegas的新功能——触摸编辑
- python 对excel操作用法详解_Python对excel文档的操作方法详解
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战...
- new 关键字做的事
- .caj文件转换为.pdf文件
- C++primer plus第六版课后编程题答案14.3(仅供参考)
- OSChina 周六乱弹 —— 女菩萨,你可愿做贫僧的……
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx
- 创造与魔法怎么自建服务器,创造与魔法如何搭建出梦想中的房屋
热门文章
- 怎么把云服务器的文件拷出来,怎么把云服务器的文件拷出来
- 2019全球医疗影像巨头排名(根据2018年全球收入)
- 以下对python程序缩进格式描述错误的是_关于 Python 程序格式框架,以下选项中描述错误的是 _________ 。_学小易找答案...
- mysql的配置文件的各项参数意思
- Arduino接收航模遥控器RC接收机的PWM数据
- 一款可扩展跨平台网络安全工具套件CaptfEncoder
- 开源企业虚拟化Proxmox VE(PVE)6.3 安装
- java套打pdf做模版itext填数据
- 性能测试监控工具Server Agent无法监控资源,jmeter报错
- 2022-2028年全球与中国低速电动汽车行业发展趋势及投资战略分析