PNG文件的组成

一个PNG文件可以看作是由多个数据块(chunk)部分组成,如同积木一样,一个数据块就是一个小积木,不同类型的积木组合搭建成了我们的PNG图像。

PNG图像至少由文件署名域和三个关键数据块IHDR,IDAT,IEND组成,因此一个最小PNG图像可以抽象的表示成如下图像

我们结合png图像来了解png文件格式,用16进制编辑器打开该图片来分析。

上图包含的三个关键数据块的主要作用如下

1.PNG文件署名域(magic number)

png文件在开头用署名域标志了该文件的类型,长度为8个字节。因此一个文件只要前8个字节值为89 50 4E 47 0D 0A 1A 0A,我们就可以认为该文件为png

[署名域(8Bytes)]:标识文件类型为png格式

PS:试着在C用字符类型打印50 4E 47,你会发现打印出PNG三个字符

2.IHDR(Image Header) chunk:描述影像的维度、色彩深度、色彩格式、压缩类型等

3.IDAT(Image Data)chunk:存储影像的像素数据

4.IEND(Image End)chunk:PNG数据流结束

PNG的Chunk有很多类型,这里只介绍了最关键的三种

数据块结构

PNG中一个Chunk的结构通常如下

名称 大小(字节) 说明
Length(长度) 4 标识了数据块的长度(包括长度域)
Chunk Type Code(数据块类型) 4 标志了该数据块的类型
Chunk Data(数据库长度) 可变 根据不同的类型数据块长度不一样,取决于Chunk Type Code
CRC(循环冗余检验) 4 检验数据块是否出错

IHDR数据块

将上图图像文件的IHDR表示如上,BD(Bit Depth),CT(Color Type),CM(Compression method),FM(fjlter method),IM(Insterlace Method)具体介绍如下

域名 字节数(Byte) 说明
Width 4 图像宽度,以像素为单位
Height 4 图像高度,以像素为单位
Bit Depth 1 图像深度:
索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16
真彩色图像:8或16
Color Type 1 颜色类型:
0:灰度图像, 1,2,4,8或16
2:真彩色图像,8或16
3索引彩色图像,1,2,4或8
4:带α通道数据的灰度图像,8或16
6:带α通道数据的真彩色图像,8或16
Compression method 1 压缩方法(LZ77派生算法)
Filter Method 1 滤波器方法
Interlace method 1 隔行扫描方法:
0:非隔行扫描
1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

我们从上可以得到该图像的分辨率为128*128,图像深度为彩色图像,没有使用压缩、滤波器等信息。

LZ77压缩算法和rar的压缩方式是一致的

IDAT数据块

IDAT数据块存储的格式取决于PNG的格式以及是否压缩。

PNG文件格式分为PNG-24和PNG-8,其最大的区别是PNG-24是用24位来保存一个像素值,是真彩色,而PNG-8是用8位索引值来在调色盘 中索引一个颜色,因为一个索引值的最大上限为2的8次方既128,故调色盘中颜色数最多为128种,

一旦使用了压缩我们必须使用zlib解压才能看见它的具体颜色。

IEND数据块

值得注意的是,IEND区块虽然也按照数据块的结构,但Chunk Data是没有的,所以是固定的96个字节:0x00000000 0x49454e44 0xae426082

IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82

参考资料

(Yolo的svpng)[https://zhuanlan.zhihu.com/p/26525083]
(PNG文件格式分析)[http://blog.csdn.net/hherima/article/details/45847043]

PNG文件格式的更多相关文章

  1. RIFF和WAVE音频文件格式

    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...

  2. JavaSe:Properties文件格式

    Properties文件格式说明 Properties继承自Hashtable,是由一组key-value的集合. 在Java中,常用properties文件作为配置文件.它的格式是什么样的呢? 下图 ...

  3. Dotnet文件格式解析

    0x0.序 解析过程并没有介绍对pe结构的相关解析过程,网上此类相关资料很多可自行查阅,本文只介绍了网上资料较少的从pe结构的可选头中的数据目录表中获取dotnet目录的rva和size,到完全解析d ...

  4. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  5. iOS 图片文件格式判断、圆角图片

    1.圆角图片 // 设置圆形图片(放到分类中使用) - (UIImage *)cutCircleImage { UIGraphicsBeginImageContextWithOptions(self. ...

  6. 基于 Hive 的文件格式:RCFile 简介及其应用

    转载自:https://my.oschina.net/leejun2005/blog/280896 Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度 ...

  7. 图解JVM的Class文件格式(详细版)

          了解JAVA的Class文件结构有助于掌握JAVA语言的底层运行机制,我在学习的过程中会不断的与ELF文件格式作对比(当然他们的复杂程度.格式相去甚远,比如可执行ELF的符号表解析在静态链 ...

  8. dex文件格式一

    一.生成dex文件 我们可以通过java文件来生成一个简单的dex文件 编译过程: 首先编写java代码如下: (1) 编译成 java class 文件 执行命令 : javac Hello.jav ...

  9. dex文件格式二

    一. dex文件头 (1) magic value 在DexFile.c   dexFileParse函数中 会先检查magic opt 啥是magic opt呢? 我们刚刚从cache目录拷贝出来的 ...

  10. stl文件格式

    http://wenku.baidu.com/view/a3ab7a26ee06eff9aef8077b.html [每个三角形面片的定义包括三角形各个定点的三维坐标及三角形面片的法矢量[三角形的法线 ...

随机推荐

  1. Maven仓库配置淘宝Maven镜像仓库

    settings.xml文件里面配置 <mirrors> <mirror>       <id>alimaven</id>       <name ...

  2. 无法用另一台电脑上的navicat链接主机数据库lost connection toMYSQl server at "handshake":reading inital communication packet,system error:34

    同事要用navicat登陆我的数据库,主机地址和密码都没错,但是报错,lost connection toMYSQl server at "handshake":reading i ...

  3. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  4. Mongodb使用shell实现与javascript的动态交互

    关于利用mongodb的shell执行脚本,这点在以前的文章中有点遗漏:现在在此篇博客中做个补充: 一.在命令行中传入脚本文件 定义一个javasciprt文件,名称为:script1.js,内容如下 ...

  5. BZOJ4710 [Jsoi2011]分特产 容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4710 题解 本来想去找一个二项式反演的题的,结果被 https://www.cnblogs.c ...

  6. webRTC脱坑笔记(一)— 初识webRTC

    webRTC概述 WebRTC--- `Web browsers with Real-Time Communications (RTC)` WebRTC是一个开源项目,可以在`Web`和本机应用程序中 ...

  7. DC/DCT/DCG 差别和联系

    在dc家族系列中,DC_V,DC_E为根本的DC(Design Compiler)对象,具有dc所具有的根本fearture,DC在synopys对象系列中地位,无足轻重,也是业界应用最普遍的综合对象 ...

  8. CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)

    传送门 解题思路 首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判.首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜, ...

  9. mysql实现“存在即更新,不存在即插入”

    方法1:使用replace关键字 replace是insert的增强版,可以实现插入的数据和已存在的数据发生主键或者唯一键重复,则删除已存在的数据,再实现插入,如果不重复,则直接插入数据. 结合Myb ...

  10. mysql联合查询sql优化

    我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...