2010年12月09日
BMP位图由一个位图文件头BITMAPFILEHEADER、一个位图信息BITMAPINFO、图像数据阵列组成。
1.位图文件头的结构为:
typedef struct tagBITMAPFILEHEADER(14字节)
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
① bfType:大小为两个字节,固定为“BM”,表示该文件为bmp文件
② bfSize:位图的大小,单位为字节
③ bfReserved1、bfReserved2为系统保留
④ bfOffBits:文件起始位置到图像数据的偏移.
当该位图为1位时(单色位图),偏移为3E
当该位图为4位时(16色位图),偏移为76
当该位图为8位时(256色位图),偏移为436
2.位图信息的结构为:
********typedef struct tagBITMAPINFO {(40字节)
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, *PBITMAPINFO;
位图信息结构包含一个位图信息头BITMAPINFOHEADER和一个调色板RGBQUAD;
********位图信息头的结构为:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; 1
2
3
4 5
6 7
8
9
10
11
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
① biSize:位图信息头的长度,即本结构所占的字节为40字节
② biWidth:位图的宽,单位为像素(bottom—up时为正)
③ biHeight:位图的高,单位为像素(bottom—up时为正)
④ biPlanes:总是1
目标设备的平面数,所以(位图的位面数,因为只有一个平面)
⑤ biBitCount:每个像素的位数
有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色,多一个透明度字节)。T408支持的是16位格式。
⑥ biCompression:压缩方式(代表bottom-up位图的压缩类型,top-dowm不能压缩)
指定位图是否压缩,有效的值为BI_RGB(0表示未压缩),BI_RLE8(256色,压缩方法为RLE8,),BI_RLE4(16色,压缩方法为RLE4),BI_BITFIELD(图像文件内的数据没有经过压缩处理,而且颜色表由表示红绿蓝的双字组成),BI_JPEG/BI_PNG(图像的格式)。
⑦ biSizeImage:用字节表示位图数据的大小。BI_RGB时为0.。
该数为4的倍数,数值上等于位图的宽度X位图高度X每个像素的字节数。
⑧ biXPelsPerMeter:用像素/米表示水平分辨率
⑨ biYPelsPerMeter:用像素/米表示垂直分辨率
⑩ biClrUsed:位图使用的颜色索引数。
为0则表示使用所有的调色板项,如果被压缩,则必须为0。
11 biClrImportant:对图像显示有重要影响的颜色索引值。如果为0,表示都重要
********调色板(颜色表)结构:
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
① rgbBlue:蓝色分量
② rgbGreen:绿色分量
③ rgbRed:红色分量
④ rgbReserved:系统保留,必须为0
注意:当biBitCount为1时调色板的个数为2的一次方,即2个,表示两种颜色
当biBitCount为4时调色板的个数为2的4次方,即16,表示16种颜色
当biBitCount为8时调色板的个数为2的8次方,即256,表示256种颜色
当biBitCount为24时,没有调色板。
3.图像数据(有图像尺寸,像素位数,和压缩方式等共同决定 )
存储颜色强度的索引值或者真实的颜色强度值。
Sizeof(BITMAPFILEHEADER)=14字节
Sizeof(BITMAPINFOHEADER)=40字节
Sizeof(RGBQUAD)=4字节
当biBitCount为0时,图像的第一个像素在bfOffBits处,bfOffBits=14+40=54字节处,像素的值表示RGB值当biBitCount不为0时,图像的第一个像素在bfOffBits处,bfOffBits=14+40+4*(2的biBitCount次方)此时像素的值并不是表示RGB值,而是调色表的颜色索引
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
可以简单的理解为:当位图的的格式为30X30时,30%4=2,所以空出的两个像素用0填充。即每一行的第31,32个像素要 用0。
因篇幅问题不能全部显示,请点此查看更多更全内容