http://www.cnblogs.com/kekec/archive/2011/08/04/2127297.html
BMP有单色,16色,256色,24位,32位几种类型位图。
BMP在磁盘上是按以下顺序存储的:
---------------header部分开始----------------
[位图文件头TBitmapFileHeader] // 14个字节
[位图信息头TBitmapInfo] // 40个字节
--------------- body部分开始 ----------------
[图像数据BGRA] // 32位位图含Alpha值
(1)位图文件头
1
2
3
4
5
6
7
|
typedef
struct
tagBITMAPFILEHEADER {
// bmfh
WORD
bfType;
// 文件标识‘BM’
DWORD
bfSize;
// 用字节表示的整个文件的大小
WORD
bfReserved1;
// 保留字节,为0
WORD
bfReserved2;
// 保留字节,为0
DWORD
bfOffBits;
// 图象数据RGBA的起始地址的偏移值 为54
} BITMAPFILEHEADER;
|
(2)位图信息头
1
2
3
4
5
6
7
8
9
10
11
12
13
|
typedef
struct
tagBITMAPINFOHEADER{
// bmih
DWORD
biSize;
// 位图信息头(Bitmap Info Header)的长度,为40
LONG
biWidth;
// 位图的宽度,以象素为单位
LONG
biHeight;
// 位图的高度,以象素为单位
WORD
biPlanes;
// 位图的位面数(注:该值将总是1)
WORD
biBitCount
// 每个象素的位数,设为24(表示24Bit位图)
DWORD
biCompression;
// 压缩说明,设为0(不压缩)
DWORD
biSizeImage;
// 用字节数表示的位图数据的大小(该数必须是4的倍数)
LONG
biXPelsPerMeter;
// 用象素/米表示的水平分辨率 (一般设为0)
LONG
biYPelsPerMeter;
// 用象素/米表示的垂直分辨率(一般设为0)
DWORD
biClrUsed;
// 位图使用的颜色数(一般设为0)
DWORD
biClrImportant;
// 指定重要的颜色数(一般设为0)
} BITMAPINFOHEADER;
PS:
位面数是调色板的数量。 位图数据一样,如果调色板不一样。图像颜色和感觉也不一样的。多数图像就一套调色板或没有,所以多数BMP 图像格式里这个设置 1 |
(3)图像数据BGRA
单色: 1个bit表示1个像素
16色: 4个bit表示1个像素
256色: 8个bit表示1个像素
24位: 24个bit表示1个像素 //BGR
32位: 32个bit表示1个像素 //BGRA
*** 数据存放顺序 ***
注:图片的左下角为图像文件数据块的起点,从左到右,从下到上依次存储图像各像素值。如上图所示!
(4)需要注意的几点
a. 像素中个颜色分量顺序为 BGRA -- Blue Green Red Alpha
以下是RGB宏的定义
1
2
3
|
#define RGB(r, g ,b) ((DWORD) (((BYTE) (r) | \
((
WORD
) (g) << 8)) | \
(((
DWORD
) (
BYTE
) (b)) << 16)))
|
可通过BYTE GetRValue(DWORD rgb) BYTE GetGValue(DWORD rgb) BYTEGetBValue(DWORD rgb)来获取各个分量的值。
b. 对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。
如:对于24位位图,假设一行有w个像素,那么一行的像素数为:4*((3*w+3)/4) // 注意(3*w+3)/4是在做整除操作