windows位图结构

注:关于如何在MFC的图片控件中完整显示位图,请参考另一篇文章:
https://blog.csdn.net/u014261408/article/details/90109820


位图文件应该具有.bmp扩展名。

位图文件格式:BITMAPFILEHEADER(位图文件头)结构,后接BITMAPINFOHEADERBITMAPV4HEADERBITMAPV5HEADER(位图信息头)结构,后接RGBQUAD(颜色表)结构数组,后接Color-index(颜色索引)数组——即实际的位图数据。

位图格式如下表所示:

BITMAPFILEHEADER
BITMAPINFOHEADER
RGBQUAD array
Color-index array

1. BITMAPFILEHEADER结构

C++:

typedef struct tagBITMAPFILEHEADER {
  WORD  bfType; //文件类型,必须是BM
  DWORD bfSize; //位图文件大小,单位是字节
  WORD  bfReserved1; //保留字,必须是0
  WORD  bfReserved2; //保留字,必须是0
  DWORD bfOffBits; //从BITMAPFILEHEADER结构第一个字节到实际位图数据的偏移量,单位是字节,
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

2. BITMAPINFOHEADERBITMAPV4HEADERBITMAPV5HEADER结构

  • BITMAPINFOHEADER:用于DIB设备无关位图
  • BITMAPV4HEADER:BITMAPINFOHEADER的扩展版本,可以向StretchDIBits函数传递JPEG或PNG图像。
  • BITMAPV5HEADER:BITMAPINFOHEADER的扩展版本

C++:

typedef struct tagBITMAPINFOHEADER {
  DWORD biSize; //结构体占有的字节数
  LONG  biWidth; //位图宽度,单位是像素(若是压缩格式,则表示解压缩之后的图片宽度)
  LONG  biHeight; //位图高度,单位是像素(正数表示位图结构是自底向上的, 负数表示
                              //位图结构是自顶向下的)
  WORD  biPlanes; //The number of planes for the target device,必须设置为1
  WORD  biBitCount; //The number of bits-per-pixel.该值决定了定义每个像素 需要的位数以
                                  //及位图的颜色数,有0,1,4,8,16,24,32
  DWORD biCompression; //拥有自底向上结构的位图的压缩类型(自顶向下不能被压缩)
  DWORD biSizeImage; //图像大小,单位是字节
  LONG  biXPelsPerMeter; //目标设备(target device)的水平分辨率,单位是像素每米
  LONG  biYPelsPerMeter; //垂直分辨率,单位同上
  DWORD biClrUsed; //The number of color indexes in the color table that are actually used by 
                                  //the bitmap.
  DWORD biClrImportant; //显示位图所必须的颜色索引数
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

3. RGBQUAD结构

表示在设备调色板中每一种颜色的RGB强度值

C++:

typedef struct tagRGBQUAD {
  BYTE rgbBlue; //颜色中的蓝色分量
  BYTE rgbGreen; //颜色中的绿色分量
  BYTE rgbRed; //颜色中的红色分量
  BYTE rgbReserved; //保留字节,必须为0
} RGBQUAD;

4. Color-index数组

该数组为位图中的每一个像素,存储一个对RGBQUAD结构的索引,以此来表现颜色。因此,颜色索引数组具有的总位数(即占有的存储空间),等于位图的像素数乘以RGBQUAD结构的索引数。比如,一个8*8的黑白位图,其颜色数组共8*8*1=64位,因为1位即可索引黑白两种颜色。再比如,16色的32*32位图Redbrick.bmp,其颜色数组共32*32*4=4096位,因为4位可以索引16种颜色(2^4=16)。

如果位图结构是自顶向下的(a top-down bitmap),颜色索引数组,即实际的位图数据,从位图的第一行开始编码。根据颜色索引数组的前n位表示的数字d,就可取得第一行最左面像素的颜色——在RGBQUAD结构中编号为d的颜色(n就是可以表示RGBQUAD结构中所有索引的二进制位数)。在索引到这一行最右面的元素时,从下一行最左面的元素继续进行索引,直到位图结束。如果是自底向上(a bottom-up bitmap)的位图,从位图的最下面一行开始,仍然从左到右,依次往上。

注:本文参考MSDN——Bitmap Storage。

你可能感兴趣的:(C/C++)