源⽂件地址:https://blog.mythsman.com/2015/12/08/1/
最近在看隐写术的时候经常需要研究图⽚⽂件的⼆进制⽂档格式,那么这就很有必要了解我们的图⽚⽂件究竟是如何保存的了,今天找了个时间看了下png⽂件的⽂档格式。总体还是挺⿇烦的,不过毕竟不需要有什么要求,能了解即可。
概述
PNG是20世纪90年代中期开始开发的图像⽂件存储格式,其⽬的是替代GIF和TIFF⽂件格式,同时增加⼀些GIF⽂件格式所不具备的特性。流式⽹络图形格式(Portable Network Graphic Format,PNG)名称来源于⾮官⽅的“PNG’s Not GIF”,是⼀种位图⽂件(bitmap file)存储格式,读成“ping”。PNG⽤来存储灰度图像时,灰度图像的深度可多到16位,存储彩⾊图像时,彩⾊图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使⽤从LZ77派⽣的⽆损数据压缩算法。(说⽩了这就是⼀种⽅便的、适于⽹络传播的轻便图⽚⽂件格式)
特性
1. 使⽤调⾊板技术可⽀持256种颜⾊的彩⾊图像。(必须的)
2. 流式读/写性(streamability):图像⽂件格式允许连续读出和写⼊图像数据。(因此适于⽹络传播)
3. 逐次逼近显⽰(progressive display):这种特性可使在通信链路上传输图像⽂件的同时就在终端上显⽰图像,把整个轮廓显⽰出来之后逐步显⽰图像的细节,也就是先⽤低分辨率显⽰图像,然后逐步提⾼它的分辨率。(类似马赛克逐渐消除的过程)4. 透明性(transparency):这个性能可使图像中某些部分不显⽰出来,⽤来创建⼀些有特⾊的图像。
5. 辅助信息(ancillary information):这个特性可⽤来在图像⽂件中存储⼀些⽂本注释信息。(就是可以说⼀些废话)6. 独⽴于计算机软硬件环境。7. 使⽤⽆损压缩。(⽆损!)
8. 可在⼀个⽂件中存储多幅图像。
⽂件结构
PNG图像格式⽂件由⽂件署名和数据块(chunk)组成。
⽂件署名域
8字节的PNG⽂件署名域⽤来识别该⽂件是不是PNG⽂件。该域的值是:⼗进制数⼗六进制数13780787113102610
504e470d0a1a0a
这个⽂件署名就是在中提到的⽂件头标志了,很简单。
数据块
这⾥有两种类型的数据块,⼀种是称为关键数据块(critical chunk),就是必须要有的块;另⼀种叫做辅助数据块(ancillary chunks)。每个数据块都由下表所⽰的的4个域组成。
名称
Length(长度)
Chunk Data(数据块实际内容CRC(循环冗余检测
字节数4字节
说明
指定数据块中数据域的长度,其长度不超过(231−1)(231−1)字节数据块类型码由ASCII字母(A-Z和a-z)组成存储⽤来检测是否有错误的循环冗余码
Chunk Type Code(数据块类型码)4字节
4字节
可变长度存储按照Chunk Type Code指定的数据
其中CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进⾏计算得到的,可以看做⼀种校验码。
关键数据块
关键数据块中的4个标准数据块是:(1) ⽂件头数据块IHDR(header chunk):
它包含有PNG⽂件中存储的图像数据的基本信息,并要作为第⼀个数据块出现在PNG数据流中,⽽且⼀个PNG数据流中只能有⼀个⽂件头数据块。
⽂件头数据块由13字节,组成结构如下:域的名称WidthHeightBit depthColorType
字节数
4
图像宽度,以像素为单位bytes
4
图像⾼度,以像素为单位bytes
1
图像深度:索引彩⾊图像:1,2,4或8 ;灰度图像:1,2,4,8或16 ;真彩⾊图像:8或16byte
1颜⾊类型:0:灰度图像, 1,2,4,8或16;2:真彩⾊图像,8或16;3:索引彩⾊图像,1,2,4或84:带α通道数据的byte灰度图像,8或16;6:带α通道数据的真彩⾊图像,8或16
说明
Compression1
压缩⽅法(LZ77派⽣算法)
methodbyteFilter methodInterlacemethod
1
滤波器⽅法byte
1
隔⾏扫描⽅法:0:⾮隔⾏扫描;1: Adam7(由Adam M. Costello开发的7遍隔⾏扫描⽅法)byte
(2) 调⾊板数据块PLTE(palette chunk):
它包含有与索引彩⾊图像((indexed-color image))相关的彩⾊变换数据,它仅与索引彩⾊图像有关,⽽且要放在图像数据块(image datachunk)之前。真彩⾊的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图像。(4) 图像结束数据IEND(image trailer chunk):
它⽤来标记PNG⽂件或者数据流已经结束,并且必须要放在⽂件的尾部。
如果我们仔细观察PNG⽂件,我们会发现,⽂件的结尾12个字符看起来总应该是这样的: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。
最后,除了表⽰数据块开始的IHDR必须放在最前⾯, 表⽰PNG⽂件结束的IEND数据块放在最后⾯之外,其他数据块的存放顺序没有。
辅助数据块
(⽐较杂,不需要全部了解透)
PNG⽂件格式规范制定的10个辅助数据块是:
1. 背景颜⾊数据块bKGD(background color)。
2. 基⾊和⽩⾊度数据块cHRM(primary chromaticities and white point)。所谓⽩⾊度是指当R=G=B=最⼤值时在显⽰器上产⽣的⽩⾊度。
3. 图像γ数据块gAMA(image gamma)。
4. 图像直⽅图数据块hIST(image histogram)。
5. 物理像素尺⼨数据块pHYs(physical pixel dimensions)。6. 样本有效位数据块sBIT(significant bits)。7. ⽂本信息数据块tEXt(textual data)。
8. 图像最后修改时间数据块tIME (image last-modification time)。9. 图像透明数据块tRNS (transparency)。
10. 压缩⽂本数据块zTXt (compressed textual data)。
数据块摘要
关键数据块、辅助数据块和专⽤公共数据块(special-purpose public chunks)综合下表中:数据块符号IHDRcHRMgAMAsBITPLTEbKGDhISTtRNSoFFspHYssCALIDATtIMEtEXtzTXtfRAcgIFggIFtgIFxIEND
数据块名称⽂件头数据块基⾊和⽩⾊点数据块图像γ数据块样本有效位数据块调⾊板数据块背景颜⾊数据块图像直⽅图数据块图像透明数据块(专⽤公共数据块)物理像素尺⼨数据块(专⽤公共数据块)图像数据块⽂本信息数据块压缩⽂本数据块(专⽤公共数据块)(专⽤公共数据块)(专⽤公共数据块)(专⽤公共数据块)图像结束数据
多数据块可选否否否否否否否否否否否否是是是是是是是否
否是是是是是是是是是是否是是是是是是是否
位置第⼀块
在PLTE和IDAT之前在PLTE和IDAT之前在PLTE和IDAT之前在IDAT之前
在PLTE之后IDAT之前在PLTE之后IDAT之前在PLTE之后IDAT之前在IDAT之前在IDAT之前在IDAT之前与其他IDAT连续⽆⽆⽆⽆⽆⽆⽆
最后⼀个数据块
图像最后修改时间数据块否
tEXt和zTXt数据块中的标准关键字:
关键字TitleAuthorDescriptionCopyrightSoftwareDisclaimerWarningSourceComment
说明
图像名称或者标题图像作者名图像说明版权声明
创作图像使⽤的软件弃权
图像内容警告创作图像使⽤的设备各种注释
CreationTime原图创作时间
⼀个例⼦
为了便于研究,我在本地找了个24x24像素的图⽚:⽤⼗六进制打开后是这样的:
1234567
0000000: 50 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR0000010: 0000 0018 0000 0018 0806 0000 00e0 773d ..............w=0000020: f800 0000 1974 4558 7453 6f66 7477 6172 .....tEXtSoftwar0000030: 6500 41 6f62 6520 496d 6167 6552 6561 e.Adobe ImageRea0000040: 79 71c9 653c 0000 0344 4944 41 78da dyq.e<...DIDATx.0000050: b4 4b48 5b51 10bd 792f 26 a346 7411 .TKH[Q..y/&F.Ft.0000060: 450b cac3 6840 8c14 0242 82 e9aa ab42 E...h@...B.B...B0000070: 5785 8614 c428 b4d0 5569 b108 5dbb 29b4 W....(..Ui..].).0000080: 1b05 a5ab 6cb3 2a14 0ab5 8b42 75a3 d188 ....l.*....Bu...
100000090: 82c6 0ff1 4320 a2e2 2f7e 12ed 9c47 e671 ....C ../~...G.q1100000a0: 8d2f 50 3a30 dcc7 bb33 67e6 cee7 5826 ./.P:0...3g...X&1200000b0: 2626 8499 288a a2ab d56a d555 55d5 57d7 &&..(....j.UU.W.1300000c0: d7d7 be6c 36fb fef2 f232 45a7 b8ba ba12 ...l6....2E.....1400000d0: c160 5014 13ab d94f 8bc5 72e3 24e0 1e9f .`P....O..r.$...1500000e0: cff7 b9ae ae4e 4c4e 4eda 3299 4c00 777c .....NLNN.2.L.w|1600000f0: 5f4c 1472 16f9 9a07 2e6a 6b6b 875a 5b5b _L.r.....jkk.Z[[170000100: 4d 4d8d e8ea ea7a 4eff 3ce2 8ea2 3018 EMM....zN.<...0.180000110: 94cb c28a 7f04 765f d3b4 27ec d0d8 d8a8 ......v_..'.....
190000120: 5655 55bd 639b 9201 a8b6 a8af 516b 9bcd VUU.c.......Qk..200000130: 26ca caca f46f 0020 7bb7 db6d 38d8 ed76 &....o. {..m8..v210000140: d1d1 d1f1 82ee 34d8 940c 0023 00c2 11e0 ......4....#....220000150: 1c20 975d 2781 3d75 381c 379c 9a9b 9b55 . .]'.=u8.7....U230000160: 2ad7 1012 bb73 0028 c073 1373 8f02 3c68 *....s.(.s.s.. 580000390: 7622 c159 82da 0000 0000 4945 4e44 ae42 v\".Y......IEND.B5900003a0: 6082 0a `.. 接下来我们试着分析⼀下: ⾸先是⼋个字节的⽂件头标志,标识着png⽂件: 150 4e47 0d0a 1a0a 接下来的地⽅就是IHDR数据块了: 0000 000d说明IHDR头块长为134948 4452IHDR标识(ascii码为IHDR) 下⾯是IHDR数据块的实际内容 0000 0018图像的宽,24像素0000 0018图像的⾼,24像素 08 表⽰⾊深,这⾥是2^8=256,即这是⼀个256⾊的图像06 颜⾊类型,查表可知这是带α通道数据的真彩⾊图像 00 PNG Spec规定此处总为0(⾮0值为将来使⽤更好的压缩⽅法预留),表⽰使压缩⽅法(LZ77派⽣算法)00 同上 00 ⾮隔⾏扫描e0 773d f8 CRC校验 以上分析了第⼀个IHDR块的内容,其他块的分析⽅法类似,⽐如接下来的就是tEXt块了,很简单,不做分析了。(当然这⾥还有重要的IDAT块,这是图像的实际内容) 最后得有个IEND数据块,这部分正如上所说,通常都应该是00 00 00 00 49 45 4E 44 AE 42 60 82 由于我⽤的是vim打开,vim在⽂件最后都会恶⼼的⾃⼰加上0a换⾏,当然这并没有什么坏的影响。不过这也提醒了我们⼀个问题,既然在IEND块后⾯添加任何的字符都对⽂件的打开造成不了影响,那我们就可以在这⾥藏⼀些数据了(当然这种藏法很low)。。。OK,这就是png⽂件的基本构造了。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fupindai.com 版权所有 赣ICP备2024042792号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务