最近在做一个韩国LG的外包项目,在图片资源处理的时候发现一个有趣的做法.
有谁知道这张图片真正包含多少张图片?
初看只有一张,其实错了,它整整包含了14张图片,像:
等等.
现在我们来回顾一下PNG图片的结构:
1.PNG的文件结构
引用内容
PNG文件标志是8 byte的,其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当作文本文件来处理。
2.PNG文件标志
十进制数 137 80 78 71 13 10 26 10
十六进制数 89 50 4E 47 0D 0A 1A 0A
3.PNG数据块包括:
IHDR 文件头数据块 第一块
PLTE 调色板数据块 在IDAT之前
IDAT 图像数据块 与其他IDAT连续
IEND 图像结束数据 最后一个数据块
如果我们仔细观察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。
好了,回归主题,一般我们处理PNG图片的常用办法是把它打包成pak,bin等形式。
然后这个游戏并没有这么做,而是把其它图片的数据直接copy到第一张图片的背后,由于PNG图片允许出现多个PNG文件头、文件尾,但它被查看的时候只显示第一张图片(有利于信息的隐藏,防盗版?)。
上图选定的地方就是第一张图片,而它后面还隐含其它13张图片的信息。
![](http://www.votbar.com/attachments/month_0703/v200739131115.png)
有谁知道这张图片真正包含多少张图片?
初看只有一张,其实错了,它整整包含了14张图片,像:
![](http://www.votbar.com/attachments/month_0703/f200739131234.png)
等等.
现在我们来回顾一下PNG图片的结构:
1.PNG的文件结构
![引用内容](http://www.votbar.com/images/quote.gif)
PNG文件标志 PNG数据块 …… PNG数据块
PNG文件标志是8 byte的,其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当作文本文件来处理。
2.PNG文件标志
十进制数 137 80 78 71 13 10 26 10
十六进制数 89 50 4E 47 0D 0A 1A 0A
3.PNG数据块包括:
IHDR 文件头数据块 第一块
PLTE 调色板数据块 在IDAT之前
IDAT 图像数据块 与其他IDAT连续
IEND 图像结束数据 最后一个数据块
如果我们仔细观察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。
好了,回归主题,一般我们处理PNG图片的常用办法是把它打包成pak,bin等形式。
然后这个游戏并没有这么做,而是把其它图片的数据直接copy到第一张图片的背后,由于PNG图片允许出现多个PNG文件头、文件尾,但它被查看的时候只显示第一张图片(有利于信息的隐藏,防盗版?)。
![](http://www.votbar.com/attachments/month_0703/q200739132931.png)
上图选定的地方就是第一张图片,而它后面还隐含其它13张图片的信息。