Visual C++中DDB与DIB位图编程全攻略(3)

4. DIB位图编程

  4.1位图文件格式

  先来分析DIB位图文件的格式。位图文件分为四部分:

  (1)位图文件头BITMAPFILEHEADER

  位图文件头BITMAPFILEHEADER是一个结构体,长度为14字节,定义为:

typedef struct tagBITMAPFILEHEADER
{
 WORD bfType; //文件类型,必须是0x424D,即字符串"BM"
 DWORD bfSize; //文件大小,包括BITMAPFILEHEADER的14个字节
 WORD bfReserved1; //保留字
 WORD bfReserved2; //保留字
 DWORD bfOffBits; //从文件头到实际的位图数据的偏移字节数
} BITMAPFILEHEADER;


  (2)位图信息头BITMAPINFOHEADER

  位图信息头BITMAPINFOHEADER也是一个结构体,长度为40字节,定义为:

typedef struct tagBITMAPINFOHEADER
{
 DWORD biSize; //本结构的长度,为40
 LONG biWidth; //图象的宽度,单位是象素
 LONG biHeight; //图象的高度,单位是象素
 WORD biPlanes; //必须是1
 WORD biBitCount;
 //表示颜色时要用到的位数,1(单色), 4(16色), 8(256色), 24(真彩色)
 DWORD biCompression;
 //指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS等,BI_RGB表示不压缩
 DWORD biSizeImage;
 //实际的位图数据占用的字节数,即 biSizeImage=biWidth' × biHeight,biWidth'是biWidth 按照4的整倍数调整后的结果
 LONG biXPelsPerMeter; //目标设备的水平分辨率,单位是每米的象素个数
 LONG biYPelsPerMeter; //目标设备的垂直分辨率,单位是每米的象素个数
 DWORD biClrUsed; //位图实际用到的颜色数,0表示颜色数为2biBitCount
 DWORD biClrImportant; //位图中重要的颜色数,0表示所有颜色都重要
} BITMAPINFOHEADER;


  (3)调色板Palette

  调色板Palette针对的是需要调色板的位图,即单色、16色和256色位图。对于不以调色板方式存储的位图,则无此项信息。调色板是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount个元素)。数组中每个元素是一个RGBQUAD结构体,长度为4个字节,定义为:

typedef struct tagRGBQUAD
{
 BYTE rgbBlue; //蓝色分量
 BYTE rgbGreen; //绿色分量
 BYTE rgbRed; //红色分量
 BYTE rgbReserved; //保留值
} RGBQUAD;


  (4)实际的位图数据ImageDate

  对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值:

  a.单色位图:用1bit就可以表示象素的颜色索引值;

  b.16色位图:用4bit可以表示象素的颜色索引值;

  c. 256色位图:1个字节表示1个象素的颜色索引值;

  d.真彩色:3个字节表示1个象素的颜色R,G,B值。

  此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐。奇怪的是,位图文件中的数据是从下到上(而不是从上到下)、从左到右方式存储的。

你可能感兴趣的:(数据结构,编程,C++,c,C#)