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. python如何简单的处理图片(1):打开\显示

    一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此, ...

  2. ivew 绑定时间控件

    <FormItem label="开始时间" style="width: 100%" prop="startDate"> < ...

  3. Jenkins服务配置容易忽略的事项

    git客户端必须安装(可直接yum安装) maven安装的版本(Jenkins上用其插件较稳健,亲测maven3.5是坑) settings.xml文件必要时,指定对应路径(一般选用Jenkins默认 ...

  4. Word图片粘贴上传控件,直接粘贴图片到编辑器-DEDE

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  5. 【HDOJ6598】Harmonious Army(最小割)

    题意:有n个人,每个人可以从A,B两种职业中选择一种 有m对两人组,如果两个人都是A能获得p的收益,一个A一个B能获得q的收益,都是B能获得r的收益,其中q=p/4+r/3,保证p%4=0,r%3=0 ...

  6. django-admin.py和manage.py的用法

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...

  7. sizeof 运算结果与编译系统有关

    研究与实现相关的layout没多大意义 参考:有关c++中类的虚拟继承sizeof问题 情况1:<剑指offer>纪念版题,sizoef(空类)的结果? class A{}; sizeof ...

  8. Linux操作系统(三)_部署JDK

    一.通过tar.gz压缩包安装 1.在usr目录下创建java目录 cd usr mkdir java 2.用rz命令上传tar.gz安装包到java目录 3.解压tar.gz安装包到当前目录 tar ...

  9. [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being

    [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent c ...

  10. Linux中zip压缩和解压缩命令

    主要参数 -c:将解压缩的结果-l:显示压缩文件内所包含的文件-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换-t:检查压缩文件是否正确-u:与-f参数类似,但是除了更新现有的 ...