原文转载链接 http://blog.sina.com.cn/s/blog_6c5a47d30102uxp6.html
现在我们常见到的.bmp图像,成为位图(Bitmap)。位图在内存中有两种类型,即:设备相关位图(DDB:Device-independent bitmaps)和设备无关位图(DIB:Device-independent bitmaps)。【可以这样理解,这种图像在硬盘上被称为BMP图,在内存中则被叫做DDB或DIB。】
DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。为了解决这一难题,微软创建了DIB位图格式。
换言之,我们现在电脑里面的.bmp图基本上可以都认为是DIB。A bitmap image file loaded into memory becomes a DIB data structure
BMP 由以下几部分组成:【可以先看本页最后的图】
请注意:1,2,3,4组成了BMP,2,3,4组成了DIB
1.BMP文件头:
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
2. DIB头
BMP位图信息头数据用于说明位图的尺寸等信息。下面两个图,左边是C++里的定义及意义,后面的是实际的存储。
3. 调色板
用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
4. 位图数据,即像素值
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节,按顺序分别为B,G,R;
当biBitCount=32时,1个像素占4个字节,按顺序分别为B,G,R,α;α表示透明度,黑为全透明,白为不透明,灰色为半透明
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
只要把这四块信息写好,图像就是没问题的,还有一些可缺省的项,详见参考1.
参考:
1. http://en.wikipedia.org/wiki/Device-independent_bitmap
2. http://baike.baidu.com/subview/7671/8245150.htm