BMP文件格式的及应用

发布日期:2011-11-6 13:26:54

1. BMP文件的组成

BMP文件的结构分成3 块或4块,分别是 文件头,文图信息头, 颜色表, 位图数据。

对于真彩色图片,没有颜色表这块,所以它的结构分成3块。

该结构列表如下:

BMP文件格式

模块 组 成 内 容

文件头 包含文件的大小、文件类型、图像数据偏离文件头的长度

位图信息头 信息头尺寸、图像用几个比特数值表示一个像素、图像是否压缩、图像所用的颜色数

颜色信息 包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。

图形数据 表示图像的相应的像素值

各模块的数据结构如下:

数据结构:

文件头 typedef struct ITMAPFILEHEADER{WORD bfType; // 位图文件的类型,必须为“BM”DWORD bfSize; // 位图文件的大小,以字节为单位WORD bfReserved1; //保留字,必须为0WORD bfReserved2; //保留字,必须为0DWORD bfOffBits; // 位图数据的偏移量,以字节为单位} BITMAPFILEHEADER; 该结构占据14个字节。

位图信息头 typedef struct ITMAPINFOHEADER{DWORD biSize; // 本结构所占用字节数LONG biWidth; // 位图的宽度,以像素为单位LONG biHeight; // 位图的高度,以像素为单位WORD biPlanes; // 须为1WORD biBitCount // 每个像素所需的位数,是 1(双色), 4(16色),8(256色)或 24(真彩色)DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或 2(BI_RLE4压缩类型)DWORD biSizeImage; // 位图数据区域的大小, 以字节为单位LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数DWORD biClrImportant; // 位图显示过程中重要的颜色数} BITMAPINFOHEADER; 该结构占据40个字节。

颜色信息 typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)BYTE rgbGreen; // 绿色的亮度(值范围为0-255)BYTE rgbRed; // 红色的亮度(值范围为0-255)BYTE rgbReserved; // 保留,必须为0} RGBQUAD;

图形数据 表示图像的相应的像素值

2. BMP文件数据存储特点

对于整个文件 从左到右, 从下到上(最下一行 To 最上一行)

对于每行 从左到右

每行存储 字节数须为4(long型)的倍数,不足要以0补齐

3. BMP文件分析

windows 下该文件属性为: 96*9, 单色, 170Bytes

分析类容的结果是:

文件头:

typedef struct tagBITMAPFILEHEADER

{

WORD bfType; 0x4D42

DWORD bfSize; AA (170Bytes)

WORD bfReserved1; 0

WORD bfReserved2; 0

DWORD bfOffBits; 3E (62)

} BITMAPFILEHEADER;

位图信息头:

typedef struct tagBITMAPINFOHEADER

{

DWORD biSize; //表示本结构的大小 28 (40Bytes)

LONG biWidth; //位图的宽度 60 (96)

LONG biHeight; //位图的高度 09 (09)

WORD biPlanes; // 1

WORD biBitCount; //位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究 1

DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 0

DWORD biSizeImage; //表示位图数据区域的大小以字节为单位 6c (108)

LONG biXPelsPerMeter; 0EC4

LONG biYPelsPerMeter; 0EC4

DWORD biClrUsed; 0

DWORD biClrImportant; 0

} BITMAPINFOHEADER;

颜色表:

FF FF , FF 00 , 00 00 , 00 00

分别是: R G B 保留

共计 4 Bytes, 后面的就是数据区了。数据是108Bytes, 即信息头中biSizeImage 的值

4.

BMP使用的格式:

1. 从位图底端开始扫描,以横向32bit (4Bytes) 为单位,不足4Bytes, 按照

4Bytes计算。

2. 扫描过程中,不足部分用0填充。

3. 横向左边为高位,右边为低位。

因此,对于 PixWidth * PixHeight 的单色图片,

BMP文件大小为:

(横向: 1――32 按照 32; 33――64 按照64…..)

BMPData:

(( PixWidth -1) / 32 +1)*32 * PixHeight Bits

5. 一些概念

对于 PixWidth * PixHeight 的单色BMP位图,有这些关系(实际上文件并部分行和列):

BMP格式:

每行的字节数: ((PixWidth-1)/32+1)*4

共有PixHeight 行

有效行 ((PixWidth-1)/8+1)

概 念 描述

色深 1,4,8,16,24

颜色数 表示有多少种颜色,例如256色

灰度图像 Eg. 8位的BMP图片相当于把黑白分成256级,0为黑,255为白。该数值表示灰度或亮度。我们称这种图片为灰度图,单色图和灰度图称黑白图,与之对应的是彩色图

RGB R对应红,G对应绿,B对应蓝色,它们统称为三基色