PNG文件格式

  1. 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

图像深度:
索引彩色图像: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
遍隔行扫描方法)

表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图片格式分析格式相关推荐

  1. NOKIA、MOTOROLA、SIMENS及ERICCSON铃声和图片格式分析(转)

    NOKIA.MOTOROLA.SIMENS及ERICCSON铃声和图片格式分析 最近一直有些朋友们要求总结一下主流手机铃声和图片的问题,由于本人在这方面基本没有什么尝试,只能将有些朋友们发表过的东西总 ...

  2. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

  3. web前端入门学习 css(10)移动端布局(学到DPG格式图片与webp格式图片停了)

    https://www.bilibili.com/video/BV14J4114768?p=390 代码:https://gitee.com/xiaoqiang001/html_css_materia ...

  4. jpg分辨率格式 jpg格式分析(转)

    JPEG格式 格式:JFIF(JPEG档的交换格式) 压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1) 以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身 ...

  5. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  6. Camera raw 12bit 图获取及格式分析(干货)

    Camera raw 12bit 图获取及格式分析(干货) 1 写图像时候发现传数据有问题 2 12bit数据格式说明 1 写图像时候发现传数据有问题 方法一, 就是自己先创建 文件,然后通过 wri ...

  7. bitmap格式分析

    位图(Bitmap)当然是最简单的,它Windows显示图片的基本格式,其文件扩展名为*.BMP.在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种格式的图片 ...

  8. 【Android RTMP】RTMP 数据格式 ( FLV 视频格式分析 | 文件头 Header 分析 | 标签 Tag 分析 | 视频标签 Tag 数据分析 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 格式解析 二. 文件头 Header 分析 三. 标签 Tag 分析 四. 视频标签 Tag 数据分析 安卓直播推流专栏博客总结 Android R ...

  9. storm的消息格式分析

    storm的消息格式分析 @(STORM)[storm] storm的消息格式分析 一ITuple接口 二core-storm的消息格式 三trident的消息格式 一trident中tuple的基本 ...

最新文章

  1. 用python做系统程序_新手小白做毕设,想用Python做一个系统,那么该学习哪方面的知识?...
  2. 3a三次方h c语言表达式,希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题...
  3. MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题
  4. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
  5. redis和memcache的区别
  6. 解决iOS设备屏幕切换时页面造成的问题
  7. 验证手机号码归属地_手机号码归属地能否取消? 工信部回复了
  8. 世界上覆盖范围最广的计算机网络是 ( ),世界上覆盖范围最广的计算机网络是()。...
  9. PJAX全局无刷新的设置方法~
  10. CSS实现间隔线样式
  11. lesson 4 Show Messages in Messagebox
  12. Vegas的新功能——触摸编辑
  13. python 对excel操作用法详解_Python对excel文档的操作方法详解
  14. 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战...
  15. new 关键字做的事
  16. .caj文件转换为.pdf文件
  17. C++primer plus第六版课后编程题答案14.3(仅供参考)
  18. OSChina 周六乱弹 —— 女菩萨,你可愿做贫僧的……
  19. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx
  20. 创造与魔法怎么自建服务器,创造与魔法如何搭建出梦想中的房屋

热门文章

  1. 怎么把云服务器的文件拷出来,怎么把云服务器的文件拷出来
  2. 2019全球医疗影像巨头排名(根据2018年全球收入)
  3. 以下对python程序缩进格式描述错误的是_关于 Python 程序格式框架,以下选项中描述错误的是 _________ 。_学小易找答案...
  4. mysql的配置文件的各项参数意思
  5. Arduino接收航模遥控器RC接收机的PWM数据
  6. 一款可扩展跨平台网络安全工具套件CaptfEncoder
  7. 开源企业虚拟化Proxmox VE(PVE)6.3 安装
  8. java套打pdf做模版itext填数据
  9. 性能测试监控工具Server Agent无法监控资源,jmeter报错
  10. 2022-2028年全球与中国低速电动汽车行业发展趋势及投资战略分析