BMP位图信息·DIB结构
2015-12-09 01:12
302 查看
一、BMP位图
1.什么是位图(与矢量图的区别)
计算机能以位图和矢量图格式显示图像。位图(Bitmap)图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像。计算机屏幕其实就是一张包含大量像素点的网格。当我们把位图放大时,每一个像素小点看上去就像是一个个马赛克色块。
矢量图(Vector)使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。
位图和矢量图最简单的区别就是:矢量图可以无限放大,而且不会失真;而位图则不能。
像Photoshop(PS)这样主要用于处理位图的软件,我们称之为图像处理软件;专门处理矢量图的软件,我们称之为图形设计软件,例如Adobe Illustrator,CorelDRAW,Flash MX等。
2.BMP位图文件
常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。
3.BMP文件结构
BMP文件由4部分组成:位图文件头(bitmap-file header)
位图信息头(bitmap-information header)
颜色表(color table)
颜色点阵数据(bits data)
24位真彩色位图没有颜色表,所以只有1、2、4这三部分。
用UltraEdit打开MyBmp.bmp,可以看到这个文件的全部数据如下图所示:
位图文件头
位图文件头分4部分,共14字节:名称 | 占用空间 | 内容 | 实际数据 |
---|---|---|---|
bfType | 2字节 | 标识,就是“BM”二字 | BM |
bfSize | 4字节 | 整个BMP文件的大小 | 0x50(80) |
bfReserved1/2 | 4字节 | 保留字,没用 | 0 |
bfOffBits | 4字节 | 偏移数,即 位图文件头+位图信息头+调色板 的大小 | 0x36(54) |
位图信息头
位图信息头共40字节:名称 | 占用空间 | 内容 | 实际数据 |
---|---|---|---|
biSize | 4字节 | 位图信息头的大小,为40 | 0x28(40) |
biWidth | 4字节 | 位图的宽度,单位是像素 | 2 |
biHeight | 4字节 | 位图的高度,单位是像素 | 3 |
biPlanes | 2字节 | 固定值1 | 1 |
biBitCount | 2字节 | 每个像素的位数 1-黑白图,4-16色,8-256色,24-真彩色 | 0x18(24) |
biCompression | 4字节 | 压缩方式,BI_RGB(0)为不压缩 | 0 |
biSizeImage | 4字节 | 位图全部像素占用的字节数,BI_RGB时可设为0 | 0x1A |
biXPelsPerMeter | 4字节 | 水平分辨率(像素/米) | 0xB12(2834) |
biYPelsPerMeter | 4字节 | 垂直分辨率(像素/米) | 0xB12(2834) |
biClrUsed | 4字节 | 位图使用的颜色数 如果为0,则颜色数为2的biBitCount次方 | 0 |
biClrImportant | 4字节 | 重要的颜色数,0代表所有颜色都重要 | 0 |
颜色表
24位真彩色位图没有颜色表。要想在Photoshop中创建有颜色表的BMP图像,选择图像>模式>索引颜色;要想查看颜色表,选择图像>模式>颜色表。本文为了简化,只讨论24位真彩色位图。
颜色点阵数据
位图全部的像素,是按照自下向上,自左向右的顺序排列的。RGB数据也是倒着念的,原始数据是按B、G、R的顺序排列的。
你应该注意到图中用黑色框起来的00 00了,在每行颜色的末尾添加的两个0字节,是为了行补位。为什么要行补位呢?因为32位的Windows操作系统处理4个字节(32位)的速度比较快,所以BMP的每一行颜色占用的字节数规定为4的整数倍。MyBmp.bmp中一行颜色有两个像素,共占用6字节,如果要补齐4*2=8字节,就要再加两个0字节。
行补位的公式为:widthBytes = (width*biBitCount+31)/32*4
Phtoshop在文件的末尾还补充了两个0字节,好像是要整体补位。不过我看过的BMP资料中都没有提到还要整体补位的,其它软件生成的BMP文件也没有整体补位的,这看起来像是Adobe的独创,不知道目的何在。
二、DIB结构
实际上,BMP文件可以分为DIB格式和DDB格式。DDB格式(Device-Dependent Bitmanp)是与设备有关的BMP文件格式,用来存储与某个显示设备或打印设备内存兼容的不压缩图像,因其依赖于硬件设备,因此不常用。DIB格式(Device-Independent Bitmanp)是与设备无关的BMP文件格式,也就是我们前面介绍的BMP文件格式,它自带颜色信息,颜色表管理非常容易,具有很强的通用性。
调入内存中的DIB位图是脱离文件而存在的,其结构可以分为三部分,如图1-14所示。内存中的DIB实际上是BMP文件结构去掉位图文件头结构后剩下的三部分,而这三部分结构包含了位图显示和处理所需要的所有信息。在本节,我们将首先编写一个基于MFC的单文档位图显示程序,使得我们能够显示任何指定的BMP文件,然后进一步采用面向对象的方法实现一个DIB类,将DIB的各种属性成员和操作函数成员集成起来,以便于后续的面向对象图像编程的实现。
资料原地址:
http://dbis.nankai.edu.cn/multimedia/color/f934daa2d4ea7fadcbefd0c6.html
http://book.51cto.com/art/200808/84544.htm
相关文章推荐
- [Java]使用gzip对字符串进行压缩/解压
- 23 Foundation框架之NSPredicate
- 22 Foundation框架之NSDictionary和NSMutableDictionary
- 21 Foundation框架之NSSet、NSMutableSet、NSCountedSet、NSOrderedSet、NSMutableOrderedSet
- Fail to build seafile-server libevhtp
- 20 Foundation框架之NSAarry和NSMutableArray
- Xcode 6/7添加创建Empty Application方式
- 01背包问题总结
- linux 基础
- Java 遍历Map时 删除元素
- 详解C语言printf函数以及%占位符知识
- Linux常用基本命令&Android系统编译命令
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月9日)
- 线性表链式实现 纯手工原创
- onSaveInstanceState() 你了解多少
- python常见注意事项
- org.springframework.dao.DataIntegrityViolationException
- 【C#】高级语言特有的单例模式
- Machine learning- PCA and ICA
- adb常用命令 & adb push和adb install区别