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) 编辑 收藏 举报