DIB和Bmp的文件结构

     DIB是Device-Independent Bitmap(设备无关位图)的缩写,它自带颜色信息,因此调色板的管理非常容易。它通常以BMP文件的形式被保存在磁盘中或者作为资源保存在EXE文件或DLL文件中。

DIB的结构

DIB是标准的Windows位图格式,BMP文件中包含了一个DIB。

一个BMP文件大体上分成如下4个部分:

第一部分为位图文件头BITMAP|FILE|HEADER,是一个结构,其定义如下:
typedef struct tagBITMAPFILEHEADER

{
WORD  bfType;   //指定文件类型,必须是0x424D,即字符串"BM",也就是说所有.bmp文件的头两个字节都是"BM"
DWORD bfSize;   //指定文件大小,包括这14个字节
WORD  bfReserved1;    //为保留字,不用考虑
WORD  bfReserved2;    //为保留字,不用考虑
DWORD bfOffBits;      // 为从文件头到实际的位图数据的偏移字节数

} BITMAPFILEHEADER;
 这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数)

 

第二部分为位图信息头BITMAP|INFO|HEADER,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER

{
        DWORD biSize;  //指定这个结构的长度,为40
        LONG  biWidth;   //指定图象的宽度,单位是象素
        LONG  biHeight;
        WORD  biPlanes;  //必须是1,不用考虑
        WORD  biBitCount  // 指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4 (16色图),8(256色),24(真彩色图)
        DWORD biCompression;   // 指定位图是否压缩
        DWORD biSizeImage;
        LONG  biXPelsPerMeter;
        LONG  biYPelsPerMeter;
        DWORD biClrUsed;    //指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。
        DWORD biClrImportant;
} BITMAPINFOHEADER;
 这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符号32位整数,LONG为32位整数)

第三部分为调色板(Palette):

当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedef struct tagRGBQUAD{
        BYTE  rgbBlue;   //该颜色的蓝色分量
        BYTE  rgbGreen;  //该颜色的绿色分量
        BYTE  rgbRed;   //该颜色的红色分量
        BYTE  rgbReserved;  //保留值
} RGBQUAD;

 

第四部分是实际的图象数据。

对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值,对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩色位图分别介绍。
对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。
对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。
对于256色位图,一个字节刚好可以表示1个像素。
对于真彩色图,三个字节才能表示1个像素

 

要注意两点:
1.每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。
2.一般来说,.BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素…接下来是倒数第二行左边第一个像素,左边第二个像素…依次类推,最后得到的是最上面一行的最右一个像素。

posted on 2014-03-14 16:05  起床吹台风睡觉开电脑  阅读(720)  评论(0编辑  收藏  举报

导航