BMP位图结构解析

BMP位图结构解析
2010年12月09日
   BMP位图由一个位图文件头BITMAPFILEHEADER、一个位图信息BITMAPINFO、图像数据阵列组成。
  1.[b]位图文件图的结构为:[/b]
  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) / 8) * bi.biHeight;
  可以简单的理解为:当位图的的格式为30X30时,30%4=2,所以空出的两个像素用0填充。即每一行的第31,32个像素要 用0。
  
  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值