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. java 局部变量与成员成员变量的区别

    package java04; /* 局部变量和成员变量的不同: 1.定义的位置不一样 局部变量:定义在方法内部 成员变量:在方法外部,直接写在类中 2.作用范围不一样 局部变量:只有方法中能使用,除 ...

  2. [BZOJ3625][Codeforces Round #250]小朋友和二叉树 多项式开根+求逆

    https://www.lydsy.com/JudgeOnline/problem.php?id=3625 愉快地列式子.设\(F[i]\)表示权值为\(i\) 的子树的方案数,\(A[i]\)为\( ...

  3. k8s-calico【转载】

    环境 系统:centos7.3192.168.40.50 local-master192.168.40.51 local-node1192.168.40.52 local-node2 master: ...

  4. Python 的 zip 和 dict 组合 生成新字典

    >>> d = dict(zip(['a', 'b'], [1, 2]))>>> d{'a': 1, 'b': 2}>>> d = dict(zi ...

  5. 11.IPFS搭建及上传获取数据——2019年12月12日

    title: ipfs使用 date: "2019-09-26 10:17:16" tags: ipfs categories: 技术驿站 1.mac安装ipfs--使用npm工具 ...

  6. centos在线安装mysql报错:file /etc/my.cnf conflicts between attempted installs of mysql-community-server-8.0.16-2.el7.x86_64 and MariaDB-common-10.4.6-1.el7.centos.x86_64

    错误提示:file /etc/my.cnf conflicts between attempted installs of mysql-community-server-8.0.16-2.el7.x8 ...

  7. boost IOStreams

    Boost.IOStreams provides numerous implementations of the two concepts. Devices which describes data ...

  8. C++ 分治思想 真假银币

    #include "stdio.h" #include "iostream" #define MAXNUM 30 int FalseCoin(int coin[ ...

  9. 【8.0.0_r4】AMS分析(十七)(ActivityManagerService.java下)

    代码位于frameworks/base/services/core/java/com/android/server/am/,一共有七十个文件. Java源码位于package com.android. ...

  10. 跨域共享cookie

    1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...