png图片文件的数据结构

PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同

时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG

)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。P

NG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,

并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。

一、数据结构

1.PNG数据块

PNG定义了两种类型的数据块,一种是称为关键数据块,这是标准的数据块,另一种叫做辅助数据

块,这是可选的数据块。关键数据块定义了5个标准数据块,每个PNG文件都必须包含它们,PNG读写软

件也必须要支持这些数据块。至于可选数据块,规范只是提倡予以支持。

下表就是PNG中数据块的类别,其中 * 号表示关键数据块:

----------------------------------------------------------------

数据块符号 数据块名称    多数据块  可选否  位置限制

----------------------------------------------------------------

*   PNG文件标识           否    第一块

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 *   图像结束数据块   否    否   最后一块

--------------------------------------------------------------

除了关键数据块,其它的数据块都是可有可无的。

2.数据块结构

PNG文件中,除了PNG文件标识外,所有的数据块均由4个部分组成,如下表:

----------------------------------------------------------------------

顺号 名称      字节数  说明

----------------------------------------------------------------------

1长度     4    指定第3部分数据域的长度

2数据块符号  4     由数据块符号的 Ascii 码组成

3数据域     不定     存储按照 Chunk Type Code 指定的数据

4CRC校验     4    又称循环冗余检测,用来检测是否有错误

----------------------------------------------------------------------

循环冗余检测中的值是对第2部分数据块符号和第3部分数据域进行计算得到的,具体算法定义在

ISO 3309 和ITU-T V.42中,其值按下面的 CRC 码生成多项式进行计算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

3.5个关键数据块的具体结构。

①PNG文件标识

它固定为8个字节:89 50 4E 47 0D 0A 1A 0A,前4个字节为“.PNG”的 Ascii 码。

②文件头数据块

它包含有 PNG 文件中存储的图像数据的基本信息,并要作为第二个数据块出现在 PNG 数据流中,

一个 PNG 数据流中只能有一个文件头数据块。格式如下表所示。

-----------------------------------------------------

域名称   字节数  说明

-----------------------------------------------------

数据域长度  4   指定数据域的长度,固定为00 00 00 0D

数据块符号  4    49 48 44 52,是“IHDR”的 Ascii 码

(以下13个字节是数据域)

图像宽度   4   单位:像素

图像高度   4   单位:像素

颜色深度   1    灰度图像:1、2、4、8 或 16

真彩色图像:8 或 16

索引彩色图像:1、2、4 或 8

带α通道数据的灰度图像:8 或 16

带α通道数据的真彩图像:8 或 16

颜色类型   1   灰度图像:0

真彩色图像:2

索引彩色图像:3

带α通道数据的灰度图像:4

带α通道数据的真彩色图像:6

压缩方法   1    规定此字节为0(使用LZ77派生算法压缩)

滤波器方法   1   通常此字节为0

隔行扫描方法 1   非隔行扫描:0

Adam7(7遍隔行扫描方法):1

CRC校验     4

-----------------------------------------------------

③调色板数据块

包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之

前。它定义图像的调色板信息,其数据结构如下:

----------------------------------------------------------------------

域名称     字节数  说明

----------------------------------------------------------------------

数据域长度  4    指定数据域的长度

数据块符号  4     50 4C 54 45,是“PLTE”的 Ascii 码

数据域     不定     n个调色板,就有3×n个字节长度,最多 3×256 字节

CRC校验     4

----------------------------------------------------------------------

每一个调色板由表示红、绿、蓝信息的3个字节组成,因此,调色板的长度应该是3的整倍数,否

则就是非法的调色板。

对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色

板的颜色数不能超过文件头数据块中“颜色深度”规定的颜色数(例如图像色深为4时,调色板中的颜

色数不可超过2^4=16),否则将导致 PNG 图像不合法。

真彩色图像和带α通道数据的真彩色图像可以有调色板数据块,目的是便于非真彩色显示程序用它

来量化图像数据,从而显示该图像,也可以不要调色板。

④图像数据块

它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。其数据结构如下:

--------------------------------------------------------

域名称     字节数  说明

--------------------------------------------------------

数据域长度  4    指定数据域的长度

数据块符号  4     49 44 41 54,是“IDAT”的 Ascii 码

数据域     不定    存放着图像真正的数据信息(压缩的)

CRC校验     4

--------------------------------------------------------

由于图像数据域是压缩数据,如果你能够掌握压缩和解压缩的方法,那么你就能轻易而举地将其它

类型的图片转换成PNG图片,或者将PNG图片转换成其它类型的图片。

⑤图像结束块

它用来标记PNG文件或者数据流已经结束,必须要放在文件的尾部。其数据结构如下:

--------------------------------------------------------

域名称     字节数  说明

--------------------------------------------------------

数据域长度  4    全为0:00 00 00 00

数据块符号  4     49 45 4E 44,是“IEND”的 Ascii 码

数据域

CRC校验     4    AE 42 60 82

--------------------------------------------------------

二、一个具体的例子

用系统画图新建一个8×8像素的图像,填充红色,另存为PNG图片,该图片全部数据如下(注:因

设备差异,你的数据也许会有微小不同):

--------------------------------------------------------

000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

000010: 00 00 00 08 00 00 00 08 08 02 00 00 00 4B 6D 29

000020: DC 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00

000030: 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00

000040: 00 20 63 48 52 4D 00 00 7A 26 00 00 80 84 00 00

000050: FA 00 00 00 80 E8 00 00 75 30 00 00 EA 60 00 00

000060: 3A 98 00 00 17 70 9C BA 51 3C 00 00 00 17 49 44

000070: 41 54 18 57 63 FC CF 80 03 00 25 B0 22 EC A2 20

000080: 63 06 52 07 00 11 99 38 C9 DB F8 06 FD 00 00 00

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

--------------------------------------------------------

分析:

000000-000007:这8个字节为 PNG 文件标识。

000008-000020:文件头数据块,其中:

00 00 00 0D:数据域长度为13字节

49 48 44 52:文件头数据块符号“IHDR”

00 00 00 08:图像宽8像素

00 00 00 08:图像高8像素

08:24位颜色深度

02:颜色类型为真彩

00:使用压缩

00:滤波器方法,通常为0

00:非隔行扫描

4B 6D 29 DC:CRC校验码

000021-00002D:可选数据块 sRGB

00002E-00003D:可选数据块 gAMA(图像γ数据块)

00003E-000069:可选数据块 cHRM(基色和白色点数据块)

00006A-00008C:IDAT数据块,其中:

00 00 00 17:数据域长度为23字节

49 44 41 54:IDAT数据块符号“IDAT”

18 57 63… :压缩的数据

DB F8 06 FD:CRC校验码

00008D-000098:IEND数据块,如上所说,固定为 00 00 00 00 49 45 4E 44 AE 42 60 82

由于 PNG 中规定除关键数据块外,其它的辅助数据块都为可选的,因此,我们可以用Hex编辑器来

对这些数据做增删试验(Hex编辑器下载地址:新帆新闻组“计算机附件组”2008年4月28日笔者发贴)

1.为图片减肥:利用Hex编辑器的删除功能,删除000020-000069这3个辅助数据块,文件字节数由原

来的153字节缩减到80字节,而并不影响图像的内容!试试看,你成功了吗?

但要注意的是,PNG 格式可以保存图像中的层、文字等信息,一旦删除了这些数据后,图像将失去

原来的可编辑性。

2.添加文本信息:增加这么一个字符串“PNG图片”,字符串的Ascii码是50 4E 47 CD BC C6 AC,共7个字节,所以数据域长度应为00 00 00 07,数据块符号是“tEXt”,Ascii码是74 45 58 74,至于CRC校验码,我们随便写4个字节,就写 BA 2D 29 CC 吧!这些信息全合起来就是:  00 00 00 07 74 45 58 74 50 4E 47 CD BC C6 AC BA 2D 29 CC共19字节。由于tEXt数据块可以出现在任意数据块之间,我们就利用Hex编辑器的插入功能把这19个字节从000068插入吧,然后另存为,再用附件中的代码打开它,我们就不仅可以看到图像,还可以看到这个字符串文本了!

Png转bmp android,png图片文件的数据结构以及转换为bmp位图的源代码相关推荐

  1. png图片文件的数据结构以及转换为bmp位图的源代码

    png图片文件的数据结构 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同 时增加一些GIF文件格式所不具备的特性.流式网络图形格式(Portabl ...

  2. 漂白android软件,图片文件漂白软件

    图片文件漂白软件专门处理一些底灰与透底严重的图片,处理需要保留彩色图案的图片,比如图章,提供去除灰度.去麻点.对比度增强.文档美颜等功能,特别适用于对图片质量要求较高的场景,对于老旧文档的修复液非常友 ...

  3. android获取本地图片后缀,Android向图片文件添加扩展信息EXIF如地点,时间,人物等...

    最近在做一个功能,需要获取图片的拍摄时的地理位置信息,经纬度 我一直想找怎样把经纬度直接存放到文件信息里面去,不然太难维护一一对应的这些信息了,最后终于被我找到了,那就是伟大的图片扩展信息 EXIF ...

  4. Android drawable 图片文件夹 缩放问题

    屏幕尺寸Screen size : 显示屏幕的实际大小,按照屏幕的对角线进行测量.small, normal, large, and xlarge 长宽比Aspect ratio : 长宽比是屏幕的物 ...

  5. 让 Android 可以识别BMP图片文件,且目前Android所支持的所有图片格式

      在Android自带到图片浏览器中,默认是不支持BMP格式的图片文件到,通过修改源码使得它支持BMP文件. Android 的图片编码解码是由 Skia 图形库负责的,Skia 通过挂接第三方开源 ...

  6. mfc读取bmp文件_LIUNX 工程bmp.c 显示图片 开发板出来的图片只有一个角 求大佬解决...

    #include <stdio.h> //open头文件 #include <sys/stat.h> #include <fcntl.h> //write 头文件 ...

  7. C实现几种对BMP图片文件的处理

    #C实现几种对BMP图片文件的处理 ##什么是BMP文件? BMP(全称Bitmap-File)是Windows操作系统中的一种标准的图像文件格式,能够被多种Windows应用程序所支持.随着Wind ...

  8. android自定义相册图片和视频教程,android把图片 视频 保存到相册

    //android把图片文件添加到相册 ContentResolver localContentResolver = getContentResolver(); ContentValues local ...

  9. Java打印图片文件 Demo

    当我们需要在Java程序中打印图片文件时,我们可以使用Java的打印API.Java的打印API是一个强大的框架,它允许我们在Java程序中与打印机交互,从而实现打印的功能. 在Java中打印图片文件 ...

最新文章

  1. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树
  2. UE4蓝图无代码编程游戏开发技能学习教程
  3. php乱码解决方案,php中文乱码问题的4种解决方案
  4. java写航显系统_一种机场航显系统的制作方法
  5. 如何在QT中读取串口数据
  6. struct和byte[]相互转换(用Marshal类实现)
  7. iOS input被键盘遮挡
  8. esd防护_电路级ESD防护方法
  9. Android之仿网易V3.5新特性
  10. java 两位小数 四舍五入_java里的四舍五入(保留两位小数,返回double类型)
  11. 组合数学—容斥原理与鸽巢原理
  12. 相对开音节java,L314 单音节词读音规则(二)-元音字母发音规则
  13. Android 接入阿里云推送com.aliyun.ams:alicloud-android-push:3.7.4步骤(二)
  14. 百度bae专业版svn提交问题
  15. Ubuntu真心不太适合搞开发啊
  16. android性能测试自动化,Android App自动化性能测试探究
  17. 油猴脚本 from greasyfork
  18. Qcom平台 Camera 之常见错误和问题
  19. SDWAN组网典型应用
  20. UNIX 环境高级编程总结——第五章 标准I/O 库

热门文章

  1. 【string】字符串分割strock
  2. Perl完全自学手册图文教程
  3. 干货|新产品在社交媒体平台推广前的准备工作
  4. 马尔可夫随机场 MRF 个人理解
  5. 蓝桥杯 Java 基础练习 vip试题
  6. Matlab:使用地理坐标区指定地图范围
  7. laravel 七牛 上传文件配置
  8. C#窗口调用百度云实现人脸识别。(注意代码中添加的控件以及部分传值给函数,亲测百分百可用。)
  9. App自动化测试-原理与安装-Appium+Python+网易mumu模拟器
  10. 【原创】谈谈34后自己工作的心态