PNG文件结构分析

本文详细解读了PNG文件结构,包括文件署名域、关键数据块(IHDR、PLTE、IDAT、IEND)和辅助数据块,重点介绍了文件头数据、调色板、图像数据和结束标志等内容,适合理解PNG图像格式的工作和开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概述

流式网络图形格式(Portable Network Graphic Format,PNG)是一种位图文件(bitmap file)存储格式。PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。


PNG文件结构

  • PNG图像格式文件由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG标识符PNG数据块
(IHDR)
PNG数据块
(其他类型数据块)
PNG结尾数据块
(IEND)

1.PNG标识符(文件署名域)

PNG文件署名域由固定的8字节的来表示,用于识别该文件是不是PNG文件。

十进制数137 80 78 71 13 10 26 10
十六进制数89 50 4E 47 0D 0A 1A 0A

在这里插入图片描述

2. PNG数据块

(1)数据块格式

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

(2)数据块类型

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。

<1>关键数据块

关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

数据块符号数据块名称多数据块是否可选位置限制
IHDR文件头数据块第一块
PLTE调色板数据块在IDAT之前
IDAT图像数据块与其他IDAT连续
IEND图像结束数据最后一个数据块
i.文件头数据块IHDR
  • 它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
  • 文件头数据块数据域由13字节组成。格式如下表:
域的名称字节数说明
Width4表示图像宽度,以像素为单位
Height4表示图像高度,以像素为单位
Bit depth1表示图像深度
索引彩色图像:1,2,4或8
灰度图像:1,2,4,8或16
真彩色图像:8或16
Color Type1颜色类型:
0:灰度图像, 1,2,4,8或16
2:真彩色图像,8或16
3:索引彩色图像,1,2,4或8
4:带α通道数据的灰度图像,8或16
6:带α通道数据的真彩色图像,8或16
Compression method1压缩方法(LZ77派生算法)
Filter method1滤波器方法
Interlace method1隔行扫描方法:
0:非隔行扫描
1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

在这里插入图片描述

  • 以上图为例:
    00 00 00 0D:IHDR数据块数据域长为13
    49 48 44 52:IHDR数据类型码(标识)
    00 00 03 30:表示图像的宽度,816像素
    00 00 04 DB:表示图像的高度,1243像素
    08: 表示图像比特深度,即这是一个256色的图像
    06: 表示颜色类型,即这是一个带α通道数据的真彩色图像
    00: PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),
      表示使压缩方法(LZ77派生算法)
    00:表示滤波器方式
    00:表示非隔行扫描
    46 2C 50 D4:CRC校验码
ii. 调色数据块PLET
  • 调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
  • PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色字节数意义
Red10 = 黑色, 255 = 红
Green10 = 黑色, 255 = 绿色
Blue10 = 黑色, 255 = 蓝色
iii. 图像数据块IDAT(image data chunk)
  • 它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

    在这里插入图片描述

  • 以上图为例
    00 00 1A 3C :表示IDAT数据块数据域长度为6716字节
    49 44 41 54 :表示IDAT数据块类型码(标识)
    78 9C… … : 表示IDAT数据块数据域中数据
    C9 26 D0 50 :CRC校验码

iv. 图像结束数据IEND(image trailer chunk)
  • 它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
    在这里插入图片描述
  • 以上图为例:
    00 00 00 00 :一般IEND数据块数据域长度为0
    49 45 4E 44 :表示IEND数据类型码(标识)
    AE 42 60 82 :CRC 校验码
<2> 辅助数据块
数据块符号数据块名称多数据块可选否位置限制
cHRM基色和白色点数据块在PLTE和IDAT之前
gAMA图像γ数据块在PLTE和IDAT之前
sBIT样本有效位数据块在PLTE和IDAT之前
bKGD背景颜色数据块在PLTE之后IDAT之前
hIST图像直方图数据块在PLTE之后IDAT之前
tRNS图像透明数据块在PLTE之后IDAT之前
oFFs(专用公共数据块)在IDAT之前
pHYs物理像素尺寸数据块在IDAT之前
sCAL(专用公共数据块)在IDAT之前
tIME图像最后修改时间数据块无限制
tEXt文本信息数据块无限制
zTXt压缩文本数据块无限制
fRAc(专用公共数据块)无限制
gIFg(专用公共数据块)无限制
gIFt(专用公共数据块)无限制
gIFx(专用公共数据块)无限制

在这里插入图片描述

  • 以上图为例:
    00 00 00 06 : 表示bKGD数据块数据域长度,为6字节
    62 4B 47 44 :表示bKGD数据块类型码(标识)
    00 FF 00 FF 00 FF:bKGD数据块数据
    A0 BD A7 93:CRC 校验码
    在这里插入图片描述
  • 以上图为例
    00 00 00 09:表示pHYs数据块数据域长度,为9字节
    70 48 59 73:表示pHYs数据块类型码(标识)
    00 00 0E C4 00 00 0E C4 01:pHYs数据块数据
    95 2B 0E 1B:CRC校验码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值