PNG文件结构分析

PNG文件结构分析

一、概述

PNG(Portable Network Graphics,便携式网络图形)是一种常见的图像存储格式。PNG可以支持透明背景,也可以保证在无损压缩前提下,将文件体积减到最小。PNG格式还为灰度图像和彩色图像分别16bit和48bit像素深度,还可以存储16位的α通道。

还具有以下特点:
流式读/写性
逐次逼近显示(先用低分辨率显示图像,然后逐步提高其分辨率)

真彩色数据流,但是可以有调色板数据块(PLTE)

二、文件结构

文件署名域

8字节;用于识别该文件是否为PNG文件;值如下:

在这里插入图片描述

数据块

每个数据块都由下表所示的四个域组成

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

包含PNG文件中存储的图像数据的基本信息,是PNG数据流中的第一个数据块,一个PNG数据流中只能有一个IHDR

域的名称字节数说明
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或84:带α通道数据的灰度图像,8或16;6:带α通道数据的真彩色图像,8或16
Compression method1 byte压缩方法(LZ77派生算法)
Filter method1 byte滤波器方法
Interlace method1 byte隔行扫描方法:0:非隔行扫描;1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

以下为一个本地8*8像素的png文件:

000102030405060708090a0b0c0d0e0f
89504e470d0a1a0a0000000d49484452
00000008000000080806000000c40fbe
8b000000017352474200aece1ce90000
000467414d410000b18f0bfc61050000
00097048597300001625000016250149
5224f00000001149444154285363f84f
008c0805ffff030084b5ff0198b2ba5c
0000000049454e44ae426082
调色板数据块PLTE(palette chunk)

包含与索引彩色图像相关的彩色变换数据,置于图像数据块(image data chunk)之前。

PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成,因此调色板数据块所包含的最大字节数为768,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。调色板的颜色数不能超过图像色深中规定的颜色数,否则会非法。

便于非真彩色显示程序用它来量化图像数据。结构如下:

颜色长度含义
Red1字节0 = 黑,255 = 红
Green1字节0 = 黑,255 = 绿
Blue1字节0 = 黑,255 = 蓝
图像数据块IDAT(image data chunk)

包含实际的图像数据,允许编码器根据需要将压缩的数据流分为多个IDAT块,但它们必须连续出现,大小不限,但是过短时浪费空间。

可以出现在PNG数据流中的任何位置。

它是压缩算法的输出流。

图像结束数据IEND(image trailer chunk)

用于标记PNG文件(数据流已经结束),必须放在文件的尾部。

IEND均为:

00 00 00 00 49 45 4E 44 AE 42 60 82

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

举个例子

以下为一个本地8*8像素的png文件:

000102030405060708090a0b0c0d0e0f
89504e470d0a1a0a0000000d49484452
00000008000000080806000000c40fbe
8b000000017352474200aece1ce90000
000467414d410000b18f0bfc61050000
00097048597300001625000016250149
5224f00000001149444154285363f84f
008c0805ffff030084b5ff0198b2ba5c
0000000049454e44ae426082

首先是八个字节的文件头标志,标识着png文件:

89 50 4e 47 0d 0a 1a 0a

IHDR数据块:

00 00 00 0d 说明IHDR头块长为13

49 48 44 52 IHDR标识(ascii码为IHDR)

PLTE和IDATA:

00 00 00 08 图像的宽 8像素

00 00 00 08 图像的高 8像素

08 表示色深,这里是2^8=256,即这是一个256色的图像

06 颜色类型,查表可知这是带α通道数据的真彩色图像

00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)

00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)

00 非隔行扫描

c4 0f be 8b CRC校验字段

IEND:

00 00 00 00 49 45 4E 44 AE 42 60 82
辅助数据块

分为4大类,描述一些细节信息,下文介绍。

数据块总览
数据块符号数据块名称多数据块可选否位置限制
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图像结束数据最后一个数据块
几种辅助数据块
tRNS 透明度

Colour type为0、2或3的PNG图像(索引彩色图像)通过且tRNS块来显示透明信息,而Colour type为4或6的PNG图像(带α通道数据的灰度/真彩色图像)不需要此数据块就可以显示透明信息(直接从IDAT块的数据中提取α分量)。

如果存在tRNS块,则必须位于第一个IDAT块之前、PLTE块之后。

sRGB色彩空间

如果存在sRGB块,则图像样本符合 sRGB 颜色空间[IEC 61966-2-1],并且应使用国际颜色联盟[ICC-1]和[ICC-1A]定义的指定渲染意图进行显示。

sRGB块的Chunk data部分只有1个字节:

名称长度说明
Rendering intent1字节0:Perceptual,用于牺牲色度精度以更好地适应输出设备的图像,例如照片;
1:Relative colorimetric,用于需要颜色外观匹配(相对于输出设备白点)的图像,例如标志;
2:Saturation,用于牺牲亮度和色相以保持合适的饱和度的图像,例如图表和图形;
3:Absolute colorimetric,用于需要保留绝对色度的图像,例如用于其他输出设备的图像预览(校样)。

建议写入sRGB块的 PNG 编码器也写入gAMA块(以及可选的cHRM块)以与不使用sRGB块的解码器兼容。仅应使用以下值。

数据块Chunk data的取值(十进制)
gAMA45455
cHRMWhite point x:31270
White point y:32900
Red x:64000
Red y:33000
Green x:30000
Green y:60000
Blue x:15000
Blue y:6000

当存在sRGB块时,建议识别它并能够进行颜色管理[ICC]的解码器忽略gAMAcHRM块,而改用sRGB块。

在这里插入图片描述

物理分辨率pHYs

pHYs块指定用于显示图像的预期像素大小或纵横比。它包含了:

每单位像素数,X 轴4字节(PNG无符号整数)
每单位像素数,Y轴4字节(PNG无符号整数)
单位说明符1字节(0:单位是米
1:单位未知)

当单位说明符为 0 时,pHYs块仅定义像素纵横比;像素的实际大小仍未指定。

如果不存在pHYs块,则假定像素为正方形,并且未指定每个像素的物理尺寸。
在这里插入图片描述

压缩文本数据zTXt

推荐使用zTXt块来存储大块文本。一个zTXT块包含:

关键词1-79字节(字符串)
空分隔符1字节
压缩方式1个字节
压缩文本数据流n字节

660221)]

压缩文本数据zTXt

推荐使用zTXt块来存储大块文本。一个zTXT块包含:

关键词1-79字节(字符串)
空分隔符1字节
压缩方式1个字节
压缩文本数据流n字节
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值