BMP位图结构解析
BMP位图结构解析
2010年12月09日
BMP位图由一个位图文件头BITMAPFILEHEADER、一个位图信息BITMAPINFO、图像数据阵列组成。
1. 位图文件图的结构为:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
① bfType:大小为两个字节,固定为“BM”,表示该文件为bmp文件
② bfSize:文图的大小,单位为字节
③ bfReserved1、bfReserved2为系统保留
④ bfOffBits:文件起始位置到图像数据的偏移.
当该位图为1位时(单色位图),偏移为3E
当该位图为4位时(16色位图),偏移为76
当该位图为8位时(256色位图),偏移为436
2.位图信息的结构为:
typedef struct tagBITMAPINFO {
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;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
① biSize:位图信息头的长度,40字节
② biWidth:位图的宽,单位为像素
③ biHeight:位图的高,单位了像素
④ biPlanes:位图的位面数,因为只有一个平面,所以该值总是1
⑤ biBitCount:每个像素的位数
有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。T408支持的是16位格式。⑥ biCompression:压缩格式,0表示为压缩,1(RLE8,8位压缩),2(RLE4,4位RLE压缩),3(Bitfilelds,位域存放)RLE简单的说就是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为R5B6G5;
⑦ biSizeImage:用字节表示位图数据的大小,该数为4的倍数,数值上等于位图的宽度X位图高度X每个像素的字节数。
⑧ biXPelsPerMeter:用像素每米表示水平分辨率
⑨ biYPelsPerMeter:用像素每米表示垂直分辨率
⑩ biClrUsed:位图使用的颜色索引数。为0则表示使用所有的调色板项
⑪ biClrImportant:对图像显示有总要影响的颜色索引数。如果为0,表示都重要
调色板结构:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
① rgbBlue:蓝色分量
② rgbGreen:绿色分量
③ rgbRed:红色分量
④ rgbReserved:系统保留
注意:当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个字节;
图像像素的存储时从下到上从左到右的。即图像数据阵列的第一个像素表示位图左下角的像素,最后一个像素表示位图的第一行的最后一个像素
Windows规定一个扫描行所占的字节数必须是
4的倍数(即以long为单位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / * bi.biHeight;
可以简单的理解为:当位图的的格式为30X30时,30%4=2,所以空出的两个像素用0填充。即每一行的第31,32个像素要 用0。
猜你喜欢
转载自qoa681wj.iteye.com/blog/1357726
周排行