栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【数据压缩】第二周作业——PNG文件格式分析

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据压缩】第二周作业——PNG文件格式分析

1 PNG格式概述

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

2 PNG文件特性

1.使用调色板技术可支持256种颜色的彩色图像。
2.流式读/写性(streamability):图像文件格式允许连续读出和写入图像数据。(因此适于网络传播)
3.逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。(类似马赛克逐渐消除的过程)
4.透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像,JPEG和GIF没有这个特性
5.辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。(就是可以说一些废话)
6.独立于计算机软硬件环境
7.使用无损压缩(无损!)
8.体积小,可在一个文件中存储多幅图像

3 头文件

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

十进制表示十六进制表示
137 80 78 71 13 10 26 1089 50 4E 47 0D 0A 1A 0A
4 数据块

数据块分为两种类型,一是关键数据块(critical chunk),是必要的块;二是辅助数据块(ancillary chunks)。
每个数据块都由下表所示的的4个域组成

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

关键数据块中的4个标准数据块是:

  1. 文件头数据块IHDR(header chunk):
    它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
  2. 调色板数据块PLTE(palette chunk):
    它包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。结构如下:
颜色长度(字节)含义
Red10 = 黑,255 = 红
Green10 = 黑,255 = 绿
Blue10 = 黑,255 = 蓝
  1. 图像数据块IDAT(image data chunk):
    它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
    IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

  2. 图像结束数据IEND(image trailer chunk):
    它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
    如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
    00 00 00 00 49 45 4E 44 AE 42 60 82

解析如下:

字符含义
00 00 00 00数据块的长度总是0(除非人为加入信息)
49 45 4E 44数据标识
AE 42 60 82CRC码
4.2 辅助数据块

Ancillary Chunk(辅助数据块),类型众多,PNG文件格式规范制定了10个辅助数据块:

背景颜色数据块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)
5 实例分析

使用visual studio,通过“文件/打开/文件”,选择打开方式为二进制编辑器

以十六进制表示的二进制文件数据流

8byte文件标识
在PNG文件中,每个数据块都由下面四部分组成,所以,每次只需要读取前8个字节,就可以大致判断出数据块的类型和长度

  1. IHDR(header chunk):包含有图像基本信息,作为第一个出现的数据块并且只出现一次;
  2. PLTE(palette chunk):调色板数据块,必须存放在图像数据块之前;
  3. IDAT(image data chunk):存储实际的图像数据。PNG数据包允许包含多个连续的图像数据块;
  4. IEND(image trailer chunk):图像结束数据,表示PNG数据流结束。
5.1 关键数据块分析

1.IHDR(文件头数据块),由13字节组成,格式如下图所示:

1)
0x0D表示长度,13字节,后面四字节表明该数据块是HIDR数据块
2)
图像宽度为0x298,即664像素;长度为0x1F2,即498像素。
3)(1)图像深度为8位
(2)颜色类型为0x02,即图像真彩色图像,8或16;
(3)压缩方法,滤波器方法,隔行扫描方法:0x00。
4)
循环冗余校验码CRC: C0 D4 29 3F

2.PLTE(调色版数据块)
本例没有调色板数据块

3.IDAT(图像数据块),存储实际的数据,在数据流中可包含多个连续顺序的图像数据块
4.IEND(图像结束数据),用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
十六进制下表示为:00 00 00 00 49 45 4E 44 AE 42 60 82

5.2 辅助数据块分析


pHYs(物理像素尺寸数据块),长度为0x09,CRC为00 9A 9C 18

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号