[数据压缩]_第二周作业——PNG文件格式分析

概述

  流式网络图形格式(Portable Network Graphic Format,PNG)是一种位图文件(bitmap file)存储格式。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。
 

文件结构

PNG文件由文件署名域(8字节)和最少3个数据块(Chunk)按照特定的顺序排列而成。 

数据块分为两类:

关键数据块(Critical Chunk):必须包含的数据块。

辅助数据块(Ancillary Chunk):可选的数据块。

文件署名域

8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值:

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

在UltraEdit软件中打开.png图片

  

数据块结构

  PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

数据块的4个域组成:

名称

字节数

说明

Length (长度)

4字节

指定数据块中数据域的长度,其长度不超过(231-1)字节

Chunk Type Code (数据块类型码)

4字节

数据块类型码由ASCII字母(A-Z和a-z)组成

Chunk Data (数据块数据)

可变长度

存储按照Chunk Type Code指定的数据

CRC (循环冗余检测)

4字节

存储用来检测是否有错误的循环冗余码

  • 长度:一个4字节的无符号整数,给出数据块的数据字段的长度(以字节计)。 长度只计算数据域,为了兼容一些不支持无符号的语言,所以长度限制在(231 - 1)字节,不能达到(232 - 1)字节。
  • 数据块类型码:一个4字节的块类型代码。 为了便于描述和检查PNG文件,类型代码仅限于大写和小写的ASCII字母(A - Z和a - z,使用十进制ASCII代码表示为65-90和97-122)。 然而,编码器和解码器必须把代码作为固定的二进制值而非字符串来处理。
  • 数据域:数据块的数据域,存储按照数据块类型码指定的数据(如果有的话)。 该字段可以是长度为零。
  • 循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。 CRC始终存在,即使不包含数据块。CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。

关键数据块

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

域的名称

字节数

说明

Width

4 bytes

图像宽度,以像素为单位

Height

4 bytes

图像高度,以像素为单位

Bit depth

1 byte

图像深度: 
索引彩色图像:1,2,4或8 
灰度图像:1,2,4,8或16 
真彩色图像:8或16

ColorType

1 byte

颜色类型:
0:灰度图像, 1,2,4,8或16 
2:真彩色图像,8或16 
3:索引彩色图像,1,2,4或8 
4:带α通道数据的灰度图像,8或16 
6:带α通道数据的真彩色图像,8或16

Compression method

1 byte

压缩方法(LZ77派生算法)

Filter method

1 byte

滤波器方法

Interlace method

1 byte

隔行扫描方法:
0:非隔行扫描 
1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

红框:第一个数据块的数据域长度,即13个字节

黄框:数据块类型码,按ASCII编码得到IHDR四个字符,代表文件头数据

蓝框:文件头数据块的width域,图像宽度

绿框:文件头数据块的height域,图像高度

  • PLTE调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。

颜色

字节

意义

Red

1 byte

0 = 黑色, 255 = 红

Green

1 byte

0 = 黑色, 255 = 绿色

Blue

1 byte

0 = 黑色, 255 = 蓝色

  • 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

 

辅助数据块

透明信息数据块:tRNS chunk(Transparency chunk)
图像γ数据块:gAMA(Image gamma chunk)
基色和白色度数据块:cHRM(Primary chromaticities chunk)
标准RGB色彩空间数据块:sRGB(Standard RGB colour space chunk)
文本信息数据块:tEXt(Textual data chunk)
压缩文本数据块:zTXt Compressed textual data chunk)
背景颜色数据块:bKGD(Background colour chunk)
物理像素尺寸数据块:pHYs(Physical pixel dimensions chunk)
样本有效位数据块:sBIT(Significant bits chunk)
图像直方图数据块:hIST(Palette histogram chunk)
图像最后修改时间数据块:tIME(Image last-modification time chunk)
 

参考资料

https://blog.csdn.net/weixin_46340912/article/details/107222105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值