常见图片格式分析总结
总结一下常见的图片格式的十六进制的开头结尾以及含义(可用winhex十六进制编辑器打开图片编辑)
1、JPG文件格式:
(1)JPG = “段” + 经过压缩编码的图像数据
什么是‘段’?段是一种数据结构,主要是来控制一段数据怎样存储和表示,段的结构如下:
段 = 段标识 + 段类型 + 段长度 +段内容 (其中文件头和文件尾属于没有‘段长度’和‘段内容’的特殊的段)
(2)‘段标识’是一种固定的符号–“FF”,段的类型有30种,其中有10中是每个JPG图片中必须存在的,其余的都是可选的类型,在此,我们就那10中类型加以说明,如下:
【1】D8 —- 文件头 【2】D9 — 文件尾 【3】FE— 注释 【4】C0— 帧开始 【5】C1 — 帧开始
【6】C4 — 定义Huffman表 【7】DA — 扫描行开始 【8】DB — 定义量化表 【9】DD—定义重新开始间隔
【10】E0 — 定义交换格式和图像识别信息
因此,一般的JPG格式的图片通过十六进制的文件磁盘内容查看器发现:文件头为:FF D8 ,而且通常在此之后都有FF E0(其后一般接JFIF)来表明图像识别信息和交换格式,文件尾为:FF D9。
2、PNG文件格式:
(1)文件结构如下:
PNG文件 = PNG标识 + 数据块 + 数据块 + …… + 数据块(其中数据块的个数最少是4)
(2)PNG标识是固定的,以十六进制表示为:【89 50 4E 47 0D 0A 1A 0A】,对应的符号为:【 ‰ P N G . . . . 】
数据块分析如下:
PNG文件 - PNG标识 = IHDR + 可选数据块 + PLTE + 可选数据块 + IDAT + 可选数据块 + IEND
分别说明如下:
【1】IHDR数据块,文件头数据块,在一个PNG文件里只能有一个。
【2】PLTE数据块,调色板数据块,它仅与索引彩色图像有关,其中,‘索引图像’是指–一种把像素值直接作为RGB调色板下标的图像。
【3】IDAT数据块,图像数据块,存储实际的图像数据,在数据流中包含多个连续顺序的图像数据块。
【4】IEND数据块,图像结束数据块,表示–数据流已结束,放在文件的末尾。
以上的数据块都是以自己的名字作为开头来控制一段数据。其中,结尾数据块IEND的内容固定:
【00 00 00 00 49 45 4E 44 AE 42 60 82】,对应的符号如下:
【. . . . I E N D (后四位为CRC校验码)】
3、GIF文件格式:
(1)文件的单位是数据块,文件的结构如下:
GIF文件 = 文件头 + GIF数据流 + 文件结束块
GIF数据流 = 控制块 + 成像块 + 特殊用途块
(2)文件头大小为6个字节,而且【文件头 = 标识符(3字节) + 版本(3字节)】,其中,标识符为“GIF”,版本一般是“87a”或者“89a”。
文件结束块是一个单字节的数据块,它指示数据流的结束,值为“0x3B”,符号是“;”。
注意:GIF文件中的每个数据块都有一个块尾记录,大小为1个字节,同样也是“0x3B”。
4、BMP文件格式:
(1)文件结构如下:
BMP文件 = 文件头信息块 + 图像描述信息块 + 颜色表 + 图像数据区
(2)关于文件头信息块,0000–000D,其中,【0000–0001】为2个字节的文件标识“BM”,【0002–0005】为4个字节的文件大小的值,【0006–0009】为4个字节的保留值,分别为【00 00 00 00】,【000A – 000D】为图像数据区的起始位置(偏移量),它的值等于前三个内容的大小的和。
另外,几个比较重要的位置有:【000A—000D】图像数据的起始位置,【0022–0025】图像数据的大小,【000E–0011】图像描述信息块大小,【0012–0015】图像宽度,【0016–0019】图像高度。