图片的结构¶
Gif¶
一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF Data Stream)和文件终结器(Trailer)三个部分。
文件头部分¶
GIF署名(Signature)和版本号(Version)¶
GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a".具体描述见下表:
对应到实际文件中:
GIF数据流部分(GIF Data Stream)¶
这部分不是按照顺序记录,详细顺序参照上面的Gif总结构表
图象标识符(Image Descriptor)¶
一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C(',')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成:
注释扩展(Comment Extension)¶
这一部分是可选的(需要89a版本),可以用来记录图形、版权、描述等任何的非图形和控制的纯文本数据(7-bit ASCII字符),注释扩展并不影响对图象数据流的处理,解码器完全可以忽略它。存放位置可以是数据流的任何地方,最好不要妨碍控制和数据块,推荐放在数据流的开始或结尾。具体组成:
文件结尾部分¶
文件终结器(Trailer)¶
这一部分只有一个值为0的字节,标识一个GIF文件结束.
对应到实际中:
参考文章¶
JPG¶
JPG/JPEG内部存储是块状类型(即文件内部分为若干块),这些块由ff开头,ff后紧跟的一个标记符指明了这个块的类型。
JPEG (jpg) 文件头:FFD8FF文件尾:FF D9
这些分块按出现顺序分别是:
文件开始&结束¶
FFE0 APP0 图像识别信息¶
- FFE0:定义交换格式和图像识别信息
- 4a46 4946 00:JFIF格式标识符
- 01 01:版本号(第一个01是主版本好,第二个01是次版本号)
- 01:单位(00=无单位;01=点数/英寸;02=点数/厘米)
- 0078:为水平分辨率
- 0078:为竖直分辨率
- 00:水平点数
- 00:竖直点数
TIPs¶
- jpg文件缺少文件尾在windows下也能被正确打开。(bugku中的这是一张单纯的图片)
参考¶
PNG¶
PNG文件结构很简单,主要有数据块(Chunk Block)组成,最少包含4个数据块。
PNG图像标识符¶
根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:
IHDR数据块¶
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由13字节组成,它的格式如下表所示:
- 00 00 00 0D:IHDR头块长为13
- 49 48 44 52:IHDR标识
- 00 00 13 40:图像的宽
- 00 00 0C C0:图像的高
- 44 6D AD B8:CRC校验
IEND图像结束数据¶
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
压缩包¶
rar¶
rar 无加密状态下,压缩包里面每个文件前都有文件头表示 0x74