ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PNG文件格式分析

2022-03-19 13:32:12  阅读:318  来源: 互联网

标签:分析 文件 IDAT 调色板 文件格式 图像 数据 PNG


PNG简介

png是一种无损压缩的位图片形格式。其设计目的是为了替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。

  png格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性。png使用从LZ77派生的无损数据压缩算法,由于它压缩比高,生成文件体积小,一般被应用于JAVA程序、网页或S60程序中。
 

PNG文件结构

PNG文件一般由两大部分组成:

 ·8字节的PNG文件署名(PNG file signature)域
 ·按照特定结构组织的3个以上的数据块(chunk)

标准PNG文件结构

文件署名域数据块······数据块

一.文件署名域

作用:用来识别该文件是否为PNG文件

文件头总是用固定的字节来描述的,共8个字节

十进制数十六进制数
137 80 78 71 1310 26 1089 50 4E 47 0D 0A 1A 0A

二.数据块

PNG定义了两种类型的数据块

1.关键数据块(critical chunk),标准的数据块
2.辅助数据块(ancillary chunks),可选的数据块

 四种关键数据块

文件头数据块IHDR(header chunk)它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
调色板数据块PLTE(palette chunk)它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
图像数据块IDAT(image data chunk)它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
图像结束数据IEND(image trailer chunk)它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

十种辅助数据块

背景颜色数据块bKGD(background color)
基色和白色度数据块cHRM(primary chromaticities and white point)
图像γ数据块gAMA(image gamma)
图像直方图数据块hIST(image histogram)
物理像素尺寸数据块pHYs(physical pixel dimensions)
样本有效位数据块sBIT(significant bits)
文本信息数据块tEXt(textual data)
图像最后修改时间数据块tIME (image last-modification time)
图像透明数据块tRNS (transparency)
压缩文本数据块zTXt (compressed textual data)

​​​​​​​​​​​​​​

PNG文件格式中的数据块
数据块符号数据块名称多数据块可选否位置限制
IHDR文件头数据块第一块
cHRM基色和白色点数据块在PLTE和IDAT之前
gAMA图像γ数据块在PLTE和IDAT之前
sBIT样本有效位数据块在PLTE和IDAT之前
PLTE调色板数据块在IDAT之前
bKGD背景颜色数据块在PLTE之后IDAT之前
hIST图像直方图数据块在PLTE之后IDAT之前
tRNS图像透明数据块在PLTE之后IDAT之前
oFFs(专用公共数据块)在IDAT之前
pHYs物理像素尺寸数据块在IDAT之前
sCAL(专用公共数据块)在IDAT之前
IDAT图像数据块与其他IDAT连续
tIME图像最后修改时间数据块无限制
tEXt文本信息数据块无限制
zTXt压缩文本数据块无限制
fRAc(专用公共数据块)无限制
gIFg(专用公共数据块)无限制
gIFt(专用公共数据块)无限制
gIFx(专用公共数据块)无限制
IEND图像结束数据最后一个数据块

数据块结构

名称字节数说明
Length (长度)4字节指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code (数据块类型码)4字节数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data (数据块数据)可变长度存储按照Chunk Type Code指定的数据
CRC (循环冗余检测)4字节存储用来检测是否有错误的循环冗余码

关键数据块的结构

IHDR:它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

文件头数据块共有13个字节:

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

PLTE:它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前

​​​​​​​PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:

颜色字节意义
Red1 byte0 = 黑色, 255 = 红
Green1 byte0 = 黑色, 255 = 绿色
Blue1 byte0 = 黑色, 255 = 蓝色

因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。

对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。

真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

IDAT:图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

IEND:图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

0000000049454E44AE426082

不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
 

实例分析

使用visual studio 二进制编辑器打开png格式文件

文件头

前8个字节为 

89504E470D0A1A0A

IHDR

域的名称字节数实例数据说明
Length4 bytes数据块长度为13
Chunk Type Code4 byteswAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==IHDR标识
width4 bytes宽度为33795像素
Height4 bytes高度为32513像素
Bit depth1 byte图像深度为8位
ColorType1 byte颜色类型为6,即带α通道数据的真彩色图像
Compression method1 byte无压缩
Filter method1 byte无滤波
Interlace method1 byte非隔行扫描
CRC4 bytes循环冗余码

 pHYs

 

名称实际结果说明
Length数据块长度为9
Chunk Type Code数据块类型为pHYs
Chunk Data实际数据

 IDAT

名称实际结果说明
Length数据块长度为8192
Chunk Type Code数据块类型为IDAT
Chunk Data实际数据

 IEND

 

 

与上描述一致

参考文献

[1]PNG文件分析

 

标签:分析,文件,IDAT,调色板,文件格式,图像,数据,PNG
来源: https://blog.csdn.net/m0_58972462/article/details/123572070

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有