首页 > 其他 > 详细

BMP文件格式解析

时间:2014-04-24 05:28:23      阅读:471      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
typedef unsigned int UINT;  //2字节
bubuko.com,布布扣
bubuko.com,布布扣
typedef unsigned long DWORD;   //4个字节(32伟)
bubuko.com,布布扣

 

1、位图文件头:(14Byte)

bubuko.com,布布扣
1 typedef struct tagBITMAPFILEHEADER { /* bmfh */ 
2 UINT bfType;
3 DWORD bfSize; 
4 UINT bfReserved1; 
5 UINT bfReserved2; 
6 DWORD bfOffBits;
7 } BITMAPFILEHEADER;
bubuko.com,布布扣

UINT bfType(+0h):

说明文件的类型.(该值必须是0x4D42,也就是字符‘BM‘。如果不是就不要处理了。OS/2之类的就不要考虑处理了。)

DWORD bfSize:

说明文件的大小。以字节为单位。

bfReserved1 保留,必须设置为0
bfReserved2 保留,必须设置为0

DWORD bfOffBits(+0Ah):

说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

2、信息文件头(40Byte):

bubuko.com,布布扣
1 typedef struct tagBITMAPINFO { /* bmi */ 
2 BITMAPINFOHEADER bmiHeader;
3 RGBQUAD bmiColors[1];
4 } BITMAPINFO;
bubuko.com,布布扣

BITMAPINFOHEADER bmiHeader:

说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息

RGBQUAD bmiColors:

说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。

BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:

bubuko.com,布布扣
 1 typedef struct tagBITMAPINFOHEADER { /* bmih */
 2 DWORD biSize; 
 3 LONG biWidth; 
 4 LONG biHeight; 
 5 WORD biPlanes; 
 6 WORD biBitCount; 
 7 DWORD biCompression; 
 8 DWORD biSizeImage; 
 9 LONG biXPelsPerMeter; 
10 LONG biYPelsPerMeter; 
11 DWORD biClrUsed; 
12 DWORD biClrImportant;
13 } BITMAPINFOHEADER;
bubuko.com,布布扣

 (1)DWORD biSize(+0Eh):

 值一般为sizeof(BITMAPINFOHEADER),为什么都知道BITMAPINFOHEADER的大小为何还要多此一举呢?如果你了解了PE文件结构你就会知道为什么,以后要向    BITMAPINFOHEADER加点东西怎么办,那么这个结构大小就变了,这个是为了兼容以后的变化。

(2)LONG biWidth(+12h):

图像的宽度,以像素为单位。

(3)LONG biHeight(+16h):

图像的高度,以像素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个负数时(正向图像),图像将不能被压缩(也就是说biCompression成员将不能是BI_RLE8或BI_RLE4)。

(4)WORD biPlanes(+1Ah):

为目标说明面数,总是设为1.

(5)WORD biBitCount(+1Ch):

说明比特数/像素,其值为1、4、8、16、24、或32

(6)DWORD biCompression(+1Eh):

说明图象数据压缩的类型。其值可以是下述值之一: 
BI_RGB:没有压缩;
BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
BI_BITFIELDS:每个象素的比特由指定的掩码决定。
(7) DWORD biSizeImage(+22h):
说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0 
(8)LONG biXPelsPerMeter(+26h):
说明水平分辨率,用象素/米表示 
(9)LONG biYPelsPerMeter(+3Ah):
说明垂直分辨率,用象素/米表示 
(10)DWORD biClrUsed(+3Eh):
说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项) 
(11)DWORD biClrImportant(+42h):
说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
 
彩色表:
彩色表的定位:
(1) 彩色表的定位
应用程序可使用存储在biSize成员中的信息来查找在BITMAPINFO结构中的彩色表,如下所示:
pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))
bubuko.com,布布扣
1 typedef struct tagRGBQUAD { /* rgbq */
2 BYTE rgbBlue; 
3 BYTE rgbGreen; 
4 BYTE rgbRed; 
5 BYTE rgbReserved;
6 } RGBQUAD;
bubuko.com,布布扣

就是RGB啦……。

 

位图数据:

4. 位图数据
紧跟在彩色表之后的是图象数据字节阵列。图象的每一扫描行由表示图象象素的连续的字节组成,每一行的字节数取决于图象的颜色数目和用象素表示的图象宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。(只针对与倒向DIB,如果是正向DIB,则扫描行是由顶向下存储的),倒向DIB的原点在图像的左下角,而正向DIB的原点在图像的左上角。同时,每一扫描行的字节数必需是4的整倍数,也就是DWORD对齐的。如果你想确保图像的扫描行DWORD对齐,可使用下面的代码:
(((width*biBitCount)+31)>>5)<<2

BMP文件格式解析,布布扣,bubuko.com

BMP文件格式解析

原文:http://www.cnblogs.com/premier/p/3683509.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!