BMP 和 DIB

原文转载链接    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文件的类型、文件大小和位图起始位置等信息。

其结构定义如下:

imageimage

2. DIB头

BMP位图信息头数据用于说明位图的尺寸等信息。下面两个图,左边是C++里的定义及意义,后面的是实际的存储。

image   image

3. 调色板

用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

image image

颜色表中RGBQUAD结构数据的个数有biBitCount来确定:

当biBitCount=1,4,8时,分别有2,16,256个表项;

当biBitCount=24时,没有颜色表项。

 

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

image

 

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

 

BMPfileFormat

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值