PNG(定义):便携式网络图形是一种无损压缩的位图片形格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG使用从LZ77派生的无损数据压缩算法,一般应用于JAVA程序、网页或S60程序中,原因是它压缩比高,生成文件体积小。

问题:

1.PNG文件是如何组成的?

答:PNG由一个8字节的PNG文件署名域和按照特定结构组织的3个以上的数据块组成。

而其中,PNG定义了两种类型的数据块:关键数据块(必需的数据块)和辅助数据块(可选的数据块)

关键数据块:

关键数据块定义了4个标准数据块,每个PNG文件都必须包含他们,PNG读写软件也都支持这些数据块。

辅助数据块:

辅助数据块包括以下十个定义好的数据块:

背景颜色数据块bKGD(background color)。

基色和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。

图像γ数据块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)。

在此之中,每个数据块(无论关键数据块还是辅助数据块)都由四个域组成:

1.length(长度):四字节长,指定数据块中数据域的长度,其长度不超过(2的32(即4byte✖️8bit/byte)次方-1个)字节

2.Chunk Type Code(数据块类型码):四字节长,数据块类型码由ASCII字母(A-Z和a-z)组成

3.Chunk Data(数据块实际内容):可变长度,存储按照Chunk Type Code指定的数据

4.CRC(循环冗余检测):四字节长,存储用来检测是否有错误的循环冗余码,其域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的,可以看做一种校验码。

2.关键数据块中的四个标准数据块是什么?

(1) 文件头数据块IHDR(header chunk):

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

其中包含以下7个域:

Width:4字节,图像宽度,以像素为单位

Height:4字节,图像高度,以像素为单位

Bit Depth:1字节,图像深度

ColorType:1字节,颜色类型

Compression method:1字节,压缩方法(LZ77派生算法)

Filter method:1字节,滤波器方法

Interlace method:1字节,隔行扫描方法:0:非隔行扫描;1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

接下来:本文将以下图为例进行解释:

png计算宽和高的python脚本 png 算法_Code


png计算宽和高的python脚本 png 算法_png计算宽和高的python脚本_02


如上图所示为IHDR部分的13个字节的内容:

png计算宽和高的python脚本 png 算法_Code_03


第一部分:4字节,length,表示本部分一共13字节

png计算宽和高的python脚本 png 算法_数据块_04


第二部分:4字节,Chunk Type Code,表示四个字母的ascii码,即IHDR

png计算宽和高的python脚本 png 算法_数据_05


第三部分:Width&Height:各四字节,表示图片尺寸为700*700

png计算宽和高的python脚本 png 算法_数据_06


第四部分Bit Depth&ColorType:各一字节,表示图像深度为8位,颜色类型为带α通道数据的真彩色图像

png计算宽和高的python脚本 png 算法_Code_07


第五部分:Compression method&Filter method:均为00,表示没有压缩和滤波操作

png计算宽和高的python脚本 png 算法_数据块_08


第六部分:Interlace method:为0,表示非隔行扫描

png计算宽和高的python脚本 png 算法_png计算宽和高的python脚本_09


第七部分:CRC,四字节,循环冗余检测

(2) 调色板数据块PLTE(palette chunk):

它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。结构如下:

颜色

字节数

意义

Red

1 byte

0 = 黑色, 255 = 红

Green

1 byte

0 = 黑色, 255 = 绿色

Blue

1 byte

0 = 黑色, 255 = 蓝色

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

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

(由于本图是真彩色图像,所以没有调色板)

(3) 图像数据块IDAT(image data chunk):

图像数据块存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

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

png计算宽和高的python脚本 png 算法_数据_10


第一部分:4字节,length:该部分数据块大小为8192字节

png计算宽和高的python脚本 png 算法_数据_11


第二部分:4字节,Chunk Type Code,表示四个字母的ascii码,即IDAT

第三部分:8192字节,即数据块大小

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

它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

png计算宽和高的python脚本 png 算法_数据块_12


(PNG文件的结尾12个字符看起来总应该是这样的12个字符,标志PNG文件的结束)

3.PNG的优点和缺点都有哪些?

优点:

  • PNG支持高级别无损耗压缩。
  • PNG支持alpha通道透明度。
  • PNG支持伽玛校正。
  • PNG支持交错。
  • PNG受最新的Web浏览器支持。
    缺点:
  • 较旧的浏览器和程序可能不支持PNG文件。
  • 作为Internet文件格式,与JPEG的有损耗压缩相比,PNG提供的压缩量较少。
  • GIF格式相较于支持多图像文件和动画文件。