常见图片文件格式简析

“常见”:此处指BMP JPEG GIF PNG 四种。

 

软件:

Windows 画图(除了Photoshop,我最喜欢的编辑器,简单粗暴)

HxD

 

 

BMP

BMP文件分为4部分:

bmp文件头(bmp file header):14Byte。提供文件的格式、大小等信息 。

位图信息头(bitmap information):40Byte。提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息 。

调色板(color palette):大小由颜色索引数决定。可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表 。

位图数据(bitmap data):大小由图像尺寸决定。图像数据。

 

存储数据时,一个地址存储一字节。如果一个数据需要用多个字节表示,就要跨地址,那么存储该数据的顺序就分为两种:高地址存储高位数据,低地址存储低位数据(小端方式,Little Endian,利于计算机处理);高地址存储低位数据,低地址存储高位数据(大端方式,Big Endian,和人类一般思维类似)。BMP文件采用小端方式,高地址存储高位数据,低地址存储低位数据。甩两个链接:

http://blog.csdn.net/hackbuteer1/article/details/7722667

http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html

 

文件头:

变量名

地址偏移

大小

作用

bfType

0000h

2 Bytes

文件类型,

BM:Windows 3.1x,95,NT

BA,CI,CP,IC,PT:与 OS/2有关

bfSize

0002h

4 Bytes

文件大小,单位Byte

bfReserved1

0006h

2 Bytes

保留,必须为0

bfReserved2

0008h

2 Bytes

保留,必须为0

bfOffBits

000Ah

4 Bytes

从文件头到位图数据的偏移量(Byte)。由于调色板有无、长度不同,用于迅速从文件定位到位图数据。

 

以下,0d**** 为十进制(decimal),0x****十六进制(hexadecimal)。两个16进制数可以写成8位2进制数,因此是1 Byte。

对于本图,

42 4D :BM,Windows位图

36 DB 01 00:小端方式,= 0x0001DB36 =0d121654(Byte) = 118 KiB。与查看一致。(大小: 118KB(121,654字节) )

第一行的 06 到 09 ,4 Byte的00:两个保留位。

接下来 : 36 00 00 00,表示偏移 0x36 = 0d54字节。定位过去是 0036h 位置的17

 

位图信息头:

位图信息图说明:

这个位图信息头的大小为40个字节。位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?这里涉及到一些历史,其实位图信息头原本有很多大小的版本的。

 

调色板

甩个链接: http://blog.csdn.net/qsycn/article/details/7801145

调色板(color table)是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引。

字  段  名

大小(单位:字节)

描    述

rgbBlue

1

蓝色值

rgbGreen

1

绿色值

rgbRed

1

红色值

rgbReserved

1

保留,总为0

 

如果图像是单色、16色和256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引序号。

 

但是:

      如果位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出。

      16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。555格式只使用了15位,最后一位保留,设为0。

      24位图像使用3字节保存颜色值,每一个字节代表一种颜色,按红、绿、蓝排列。

      32位图像使用4字节保存颜色值,每一个字节代表一种颜色,除了原来的红、绿、蓝,还有Alpha通道,即透明色。

      如果图像带有调色板,则位图数据可以根据需要选择压缩与不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算法压缩。

 

位图数据

位图信息头中,大多数BMP文件的biHeight为正数,表示图像是倒像位图。所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列。

24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。 

32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。A是透明色,Alpha通道。

数据的对齐规则:

Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高 能表示的了,因为每行可能还需要进行比特填充。

 

最后甩个详细链接:

http://wenku.baidu.com/link?url=wI_UlD_9vezTJ-t7a-uBE9IS_tHPszEByGExCJ5QpnQ2wfjmFbMtee3MdczFDW5GSq60Od3Y-8NMikH68V2zNRrdXznOv7nFJS-jPRgqfPy#39124-qzone-1-24262-f00cdc7f4857236c67481f200187bab5

 

JPEG

JPEG(发音为jay-peg, IPA:[ˈdʒeɪpɛg])是一种针对相片图像而广泛使用的一种有损压缩标准方法。这个名称代表Joint Photographic Experts Group(联合图像专家小组)。

JPEG图像存储格式一个比较成熟的图像有损压缩格式,虽然一个图片经过转化为JPEG图像后,一些数据会丢失,但是,人眼是很不容易分辨出来这种差别的。也就是说,JPEG图像存储格式既满足了人眼对色彩和分辨率的要求,又适当的去除了图像中很难被人眼所分辨出的色彩,在图像的清晰与大小中JPEG找到了一个很好的平衡点。

JPEG的图片使用的是YCrCb颜色模型,而不是计算机上最常用的RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb模型更适合图形压缩.因为人眼对图片上的亮度Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit的亮度值,每2x2个点保存一个Cr Cb值,而图象在肉眼中的感觉不会起太大的变化。

JPEG文件中的字节是按照大端方式排列的,高地址存储低位数据,低地址存储高位数据。见前文。

关于有损压缩的原理,涉及高等数学原理,甩一个链接:http://zh.wikipedia.org/zh-cn/JPEG

由于早期操作系统只支持3个字符扩展名,因此 .JPG 广泛沿用至今。

一个由C-Cube Microsystems等公司所创建的额外标准,称为JFIF(JPEG File Interchange Format,JPEG文件交换格式)详细说明如何从一个JPEG流,产出一个适合于电脑存储和传输(像是在互联网上)的文件。在普遍的用法,当有人称呼一个"JPEG文件",一般而言他是意指一个JFIF文件,或有时候是一个Exif JPEG文件。然而,也有其他以JPEG为基础的文件格式,像是JNG。

JFIF的文件结构:

甩一个链接:http://baike.baidu.com/view/1326314.htm?fr=aladdin#3

JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:

SOI 0xD8  图像开始

APP0 0xE0  JFIF应用数据块

APPn 0xE1 - 0xEF  其他的应用数据块(n, 1~15)

DQT 0xDB  量化表

SOF0 0xC0  帧开始

DHT 0xC4  霍夫曼(Huffman)表

SOS 0xDA  扫描线开始

EOI 0xD9  图像结束

 

图像开始

SOI(Start of Image)标记 0h 2Byte 0xFFD8

 

APP0标记(Marker)

0h 2字节 0xFFE0

① APP0长度(length)(①~⑨九个字段的总长度)

2h 2字节内容不定(①~⑨九个字段的总长度)

② 标识符(identifier)

4h 5字节 0x4A46494600 即“JFIF0”

③ 版本号(version)

9h 2字节 0x0102 JFIF的版本号目前基本上都是1.2

④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)

bh 1字节只有0,1,2三个值可选,其分别代表的意义如上]

⑤ X方向像素密度(X density)

ch 2字节取值范围未知

⑥ Y方向像素密度(Y density)

eh 2字节取值范围未知

⑦ 缩略图水平像素数目(thumbnail horizontal pixels)

10h 1字节取值范围未知

⑧ 缩略图垂直像素数目(thumbnail vertical pixels)

11h 1字节取值范围未知

⑨ 缩略图RGB位图(thumbnail RGB bitmap)

12h 长度可能是3的倍数内容不定

本段(APP0)可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像(这种情况更常见),则⑦“缩略图水平像素数目”和⑧“缩略图垂直像素数目”的值均为0。

APPn标记(Markers)

① APPn长度(length)(①②两个字段的总长度)

② 详细信息(application specific information)

对每个APP:

若为APPN(N=1~F(以16进制表示,N任选其中一个))

· 标记: mh 2字节 0xFFEN

· 长度:(m+2)h 2字节内容不定(设为n(10进制))(本字段与下一字段的总长度)

· 详细信息: (m+4)h n-2字节(即长度减2)内容不定

一个或者多个量化表DQT

DQT(Difine Quantization Table)

0h 2字节 0xFFDB

① 量化表长度(quantization table length)(①~②两个字段的总长度)

2h 2字节内容不定(①~②两个字段的总长度)

② 量化表(quantization table)

A. P/T(高四位:精度,低四位:表ID)

B. 表项

对每个量化表:

· P/T(高四位:精度,低四位:表ID) mh 1字节精度, 0 表示 8 bit, 1表示 16 bit;ID取值范围为0~3, 否则错误

· 表项 (m+1)h (64×(精度+1))字节内容长,故略

(5) 帧图像开始SOF0(Start of Frame)

0h 2字节 0xFFC0

① 帧开始长度(start of frame length) (①~⑥六个字段的总长度)

2h 2字节内容不定(①~⑥六个字段的总长度)

② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)

4h 1字节每个样本位数, 通常是 8 (大多数软件不支持 12 和 16)

③ 图像高度(image height) 5h 2字节内容不定(如果不支持 DNL 就必须 >0)

④ 图像宽度(image width) 7h 2字节内容不定(如果不支持 DNL 就必须 >0)

⑤ 颜色分量数(number of color components)

9h 1字节内容不定(灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4,我们这里讨论的JFIF使用的是YCbCr,故这里颜色分量数为3)

⑥ 对每个颜色分量(for each component)

A. ID

B. 垂直方向的样本因子(vertical sample factor)

C. 水平方向的样本因子(horizontal sample factor) B、C共占用1字节,B占用低4位,C占用高4位)

D. 量化表号(quantization table#)

JFIF格式使用的是YCbCr所以有3个分量(这里特别要注意的是颜色分量的ID号是有含义的,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):

1) ID

ah 1字节 0x01

(高四位)水平(低四位)垂直样本因子

bh 共1字节 0x227

量化表号

ch 1字节内容不定(本分量使用的量化表的ID号)

2) ID

dh 1字节 0x02

(高四位)水平(低四位)垂直样本因子

eh 共1字节 0x11J

量化表号

fh 1字节内容不定(本分量使用的量化表的ID号)

3) ID

10h 1字节 0x03

(高四位)水平(低四位)垂直样本因子

11h 共1字节 0x11

量化表号

12h 1字节内容不定(本分量使用的量化表的ID号)

一个或者多个霍夫曼表DHT

DHT (Difine Huffman Table)

0h 2字节 0xFFC4

① 霍夫曼表的长度(Huffman table length) (①~②两个字段的总长度)

2h 2字节内容不定(①~②两个字段的总长度)

② 对每个霍夫曼表(一般情况下,霍夫曼表不止一个,但是绝对不多于4个)

A. 表号

B. 类型:AC或者DC(其中0:DC表,1:AC表);A、B共占用1字节,A占用低4位,B占用高4位)

C. 长16个字节的编码,其代码代数和为接下来的编码的长度

D. 内容编码

对每个霍夫曼表:

·(高四位)类型和(低四位)表号: mh 共1字节内容不定(有四个可能:0x00表示第0个DC表,0x01表示第1个DC表,0x10表示第0个AC表,0x11表示第1个AC表)

· 长16个字节的编码: (m+1)h 16字节内容不定(设这16个字节上数据之和为n)

· 内容编码: (m+17)h n字节内容长,故略)

定义重新开始间隔DRI

DRI (Define Restart Interval)

(在没有DRI标记,或间隔为零时,就不存在重新开始间隔和重开始标记)

0h 2字节 0xFFDD

① 长度 2h 2字节 0x0004(①~②两个字段的总长度)

② MCU 块的单元中的重新开始间隔

4h 2字节内容不定(设为n,则意思是说,每n个MCU块就有一个RSTn标记。第一个标记是RST0,然后是RST1等,RST7后再从RST0重复)

扫描开始SOS

SOS(Start of Scan)

0h 2字节 0xFFDA

① 扫描开始长度(start of scan length)

2h 2字节内容不定(①~③再加上④的A\B\C的总长度)

② 颜色分量数(number of color components)

4h 1字节应该和⑸⑤的值相同(灰度图是1, YCbCr/YIQ 彩色图是3, CMYK 彩色图是4)

③ 每个颜色分量

A. ID

B. 交流系数表号(AC table #)

C. 直流系数表号(DC table #)

(B、C共占用1字节,B:占用低4位,C:占用高4位)

由②得到这里的颜色分量数为3(这里的颜色分量的ID号的含义和⑸⑥的一样,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):

1) ID

5h 1字节 0x01 (高四位)直流(低四位)交流数表号

6h 共1字节 0x00

2) ID

7h 1字节 0x027 (高四位)直流(低四位)交流数表号

8h 共1字节 0x11

3) ID

9h 1字节 0x03 (高四位)直流(低四位)交流数表号

ah 共1字节 0x11

④ 压缩图像数据(compressed image data)

A. 谱选择开始 bh 1字节 0x00

B. 谱选择结束 ch 1字节 0x3F

C. 两个4位字段,高位和低位的谱选择 dh 1字节在基本JPEG中总为0x00

D. 数据 eh 长度不定内容长,故略

图像结束EOI

EOI (End of Image)

0h 2字节 0xFFD9

 

GIF

GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。目前几乎所有相关软件都支持它,公共领域有大量的软件在使用GIF图像文件。GIF图像文件的数据是经过压缩的,而且是采用了可变长度等压缩算法。GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。

图像互换格式主要分为两个版本,即图像互换格式87a和图像互换格式89a。

图像互换格式87a:是在1987年制定的版本。

图像互换格式89a:是在1989年制定的版本。在这个版本中,为图像互换格式文档扩充了图形控制区块、备注、说明、应用程序接口等四个区块,并提供了对透明色和多帧动画的支持。

特点:

优秀的压缩算法使其在一定程度上保证图像质量的同时将体积变得很小。

可插入多帧,从而实现动画效果。

可设置透明色以产生对象浮现于背景之上的效果。

由于采用了8位元压缩,最多只能处理256种颜色,故不宜应用于真彩色圖片。

 

Header 

GIF 文件头

 

Logical Screen Descriptor   

逻辑屏幕描述块   

 

 Global Color Table   

全局彩色表    

 

 „ 扩展模块(任选) „     

 

 

   Image Descriptor  

 图形描述块 

 

   Local Color Table  

 局部彩色表(可重复n次) 

Table Based Image Data   

表式压缩图像数据  

 Graphic Control Extension 

  图像控制扩展块 

 Plain Text Extension   

无格式文本扩展块 

n

 Comment Extension   

注释扩展块 

 Applicaton Extension   

应用程序扩展块     

 

„ 扩展模块(任选) „  

   

 

  GIF Trailer 

GIF文件结束块 

 

 

由上表可知,一个GIF文件的结构可分 为文件头(File Header)、GIF数据流(GIF Data Stream)和文件终结器(Trailer)三个部分。文件头包含GIF文件署名(Signature)和版本号(Version);GIF数据流由控 制标识符、图象块(Image Block)和其他的一些扩展块组成;文件终结器只有一个值为0x3B的字符(';')表示文件结束。

 

GIF文件头:(6个字节)

标识符(3字节) ---GIF

版本(3字节) ---87a (or 89a)

 

GIF数据流:

甩一个链接:http://wenku.baidu.com/view/2c0feaa6f524ccbff121841d.html

 

GIF文件结束块:

结束块(GIF Trailer)表示GIF文件的结尾,它包含一个固定的数值:0x3B。

 

PNG

便携式网络图形(Portable Network Graphics,PNG)是一种无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以被广泛应用于互联网及其他方面上。

PNG另一个非正式的名称来源为递归缩写:“PNG is Not GIF”。

 

特点:

支持256色调色板技术以产生小体积文件

最高支持48位真彩色图像以及16位灰度图像。

支持Alpha通道的透明/半透明特性。

支持图像亮度的Gamma校准信息。

支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。

使用无损压缩。

渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。

使用CRC防止文件出错。

最新的PNG标准允许在一个文件内存储多幅图像。

 

关于PNG格式,甩一个链接 http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm

PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道,因此可展现256级透明程度。

PNG8和PNG24后面的数字则是代表这种PNG格式最多可以索引和存储的颜色值。”8″代表2的8次方也就是256色,而24则代表2的24次方大概有1600多万色。

格式

最高支持色彩通道

索引色编辑支持

透明支持

PNG8

256索引色

支持

支持设定特定索引色为透明色(布尔透明)

支持为索引色附加8位透明度(256阶alpha透明)

PNG24

约1600万色

不支持

不支持

PNG32

约1600万色

不支持

支持8位透明度(256阶alpha透明)

 

PNG图像格式文件由一个8字节的PNG文件标识(file signature)域和3个以上的后续数据块(chunk)组成。

甩一个链接:http://baike.baidu.com/view/5342.htm?fr=aladdin#3

 

PNG文件包括8字节文件署名(89 50 4E 47 0D 0A 1A 0A,十六进制),用来识别PNG格式。

十六进制

含义

89

用于检测传输系统是否支持8位的字符编码(8 bit data),用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然。

50 4E 47

PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件。

0D 0A

DOS风格的换行符(CRLF)。用于DOS-Unix数据的换行符转换。

1A

在DOS命令行下,用于阻止文件显示的文件结束符。

0A

Unix风格的换行符(LF)。用于Unix-DOS换行符的转换。

 

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

每个数据块都由表6-07所示的的4个域组成:

名称

字节数  

说明  

Length(长度)

4字节  

指定数据块中数据域的长度,其长度不超过

(231-1)字节

Chunk Type Code(数据块类型码)

4字节

数据块类型码由ASCII字母(A-Z和a-z)组成

Chunk Data(数据块数据)

可变长度

存储按照Chunk Type Code指定的数据

CRC(循环冗余检测)

4字节

存储用来检测是否有错误的循环冗余码

长度.

一个4字节的无符号整数,给出字节的数据块的数据字段的数量。 长度计算数据字段,为了兼容一些不支持无符号的语言,所以不是(2^32-1)。

数据块类型码.

一个4字节的块类型代码。 为了便于描述和检查PNG文件,类型代码仅限于包括大写和小写的ASCII字母(A - Z和a - z或65-90和97-122十进制)。 然而,编码器和解码器必须把代码作为固定的二进制值,而不是字符串。

数据块.

数据块的数据字节,以适当的组块的类型,如果有的话。 该字段可以是长度为零。

循环冗余检测.

一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是包括长度字段。 CRC是始终存在,甚至不包含数据块。

 

IEND

图像结束数据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。

posted @ 2014-11-14 17:16  碉堡了  阅读(11697)  评论(0编辑  收藏  举报