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