typedef unsigned int UINT; //2字节
typedef unsigned long DWORD; //4个字节(32伟)
1、位图文件头:(14Byte)
1 typedef struct tagBITMAPFILEHEADER { /* bmfh */ 2 UINT bfType; 3 DWORD bfSize; 4 UINT bfReserved1; 5 UINT bfReserved2; 6 DWORD bfOffBits; 7 } BITMAPFILEHEADER;
UINT bfType(+0h):
说明文件的类型.(该值必须是0x4D42,也就是字符‘BM‘。如果不是就不要处理了。OS/2之类的就不要考虑处理了。)
DWORD bfSize:
说明文件的大小。以字节为单位。
DWORD bfOffBits(+0Ah):
说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
2、信息文件头(40Byte):
1 typedef struct tagBITMAPINFO { /* bmi */ 2 BITMAPINFOHEADER bmiHeader; 3 RGBQUAD bmiColors[1]; 4 } BITMAPINFO;
BITMAPINFOHEADER bmiHeader:
RGBQUAD bmiColors:
BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:
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;
(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):
1 typedef struct tagRGBQUAD { /* rgbq */ 2 BYTE rgbBlue; 3 BYTE rgbGreen; 4 BYTE rgbRed; 5 BYTE rgbReserved; 6 } RGBQUAD;
就是RGB啦……。
位图数据:
原文:http://www.cnblogs.com/premier/p/3683509.html