BMP文件结构()

上传人:ji****72 文档编号:37521352 上传时间:2018-04-17 格式:DOC 页数:7 大小:53.50KB
返回 下载 相关 举报
BMP文件结构()_第1页
第1页 / 共7页
BMP文件结构()_第2页
第2页 / 共7页
BMP文件结构()_第3页
第3页 / 共7页
BMP文件结构()_第4页
第4页 / 共7页
BMP文件结构()_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《BMP文件结构()》由会员分享,可在线阅读,更多相关《BMP文件结构()(7页珍藏版)》请在金锄头文库上搜索。

1、BMP 是是一一种种与与硬硬件件设设备备无无关关的的图图像像文文件件格格式式,使使用用非非常常广广。它它采采用用位位映映射射存存储储格格式式,除除了了图图像像深深度度可可选选以以外外,不不采采用用其其他他任任何何压压缩缩,因因此此,BMP 文文件件所所占占用用的的空空间间很很大大。 BMP 文文件件的的图图像像深深度度可可选选lbit、4bit、8bit 及及 24bit。BMP 文文件件存存储储数数据据时时,图图像像的的扫扫描描方方式式是是按按从从左左到到右右、从从下下到到上上的的顺顺序序。文文件件结结构构组组成成典型的 BMP 图像文件由四部分组成:1:位图文件头数据结构,它包含 BMP

2、图像文件的类型、显示内容等信息;2:位图信息数据结构,它包含有BMP 图像的宽、高、压缩方法,以及定义颜色等信息;3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24 位的 BMP)就不需要调色板;4:位图数据,这部分的内容根据BMP 位图使用的位数不同而不同,在24 位图中直接使用 RGB,而其他的小于 24 位的使用调色板中颜色索引值。类类型型位图一共有两种类型,即:设备相关位图( DDB)和设备无关位图( DIB)。DDB 位图在早期的 Windows 系统(Windows 3.0 以前)中是很普遍的,事实上它也是唯一的。然而,随着显示器制造技术的进步,以及显示

3、设备的多样化,DDB 位图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示设备是否适合显示这张图片。为了解决这一难题,微软创建了DIB 位图格式。设备无关位图 (Device-Independent Bitmap)DIB 位图包含下列的颜色和尺寸信息: 原始设备(即创建图片的设备)的颜色格式。 原始设备的分辨率。 原始设备的调色板 一个位数组,由红、绿、蓝( RGB)三个值代表一个像素。 一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。以上这些信息保存在 BITMAPINFO 结构中,该结构由

4、BITMAPINFOHEADER结构和两个或更多个 RGBQUAD 结构所组成。 BITMAPINFOHEADER 结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案等信息。RGBQUAD 结构标识了像素所用到的颜色数据。DIB 位图也有两种形式,即:底到上型DIB(bottom-up),和顶到下型 DIB(top-down)。底到上型 DIB 的原点(origin)在图像的左下角,而顶到下型DIB 的原点在图像的左上角。如果 DIB 的高度值(由 BITMAPINFOHEADER 结构中的 biHeight 成员标识)是一个正值,那么就表明这个DIB 是一个底到上型 DI

5、B,如果高度值是一个负值,那么它就是一个顶到下型DIB。注意:顶到下型的 DIB 位图是不能被压缩的。位图的颜色格式是通过颜色面板值 (planes)和颜色位值 (bitcount)计算得来的,颜色面板值永远是 1,而颜色位值则可以是 1、4、8、16、24、32 其中的一个。如果它是 1,则表示位图是一张单色位图(译者注:通常是黑白位图,只有黑和白两种颜色,当然它也可以是任意两种指定的颜色),如果它是4,则表示这是一张 VGA 位图,如果它是 8、16、24、或是 32,则表示该位图是其他设备所产生的位图。如果应用程序想获取当前显示设备(或打印机)的颜色位值(或称位深度),可调用API 函数

6、GetDeviceCaps(),并将第二个参数设为 BITSPIXEL 即可。显示设备的分辨率是以每米多少个像素来表明的,应用程序可以通过以下三个步骤来获取显示设备或打印机的水平分辨率:1. 调用 GetDeviceCaps()函数,指定第二个参数为 HORZRES。2. 再次调用 GetDeviceCaps()函数,指定第二个参数为 HORZSIZE。3. 用第一个返回值除以第二个返回值。即: GetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);应用程序也可以使用相同的三个步骤来获取设备的垂直分辨率,不同之处只是要将HORZRES 替

7、换为 VERTRES,把 HORZSIZE 替换为 VERTSIZE,即可。调色板是被保存在一个 RGBQUAD 结构的数组中,该结构指出了每一种颜色的红、绿、蓝的分量值。位数组中的每一个索引都对应于一个调色板项(即一个RGBQUAD 结构),应用程序将根据这种对应关系,将像素索引值转换为像素RGB值(真实的像素颜色)。应用程序也可以通过调用GetDeviceCaps()函数来获取当前显示设备的调色板尺寸(将该函数的第二个参数设为NUMCOLORS 即可)。Win32 API 支持位数据的压缩(只对 8 位和 4 位的底到上型 DIB 位图)。压缩方法是采用运行长度编码方案( RLE),RLE

8、 使用两个字节来描述一个句法,第一个字节表示重复像素的个数,第二个字节表示重复像素的索引值。有关压缩位图的详细信息请参见对 BITMAPINFOHEADER 结构的解释。应用程序可以从一个 DDB 位图创建出一个 DIB 位图,步骤是,先初始化一些必要的结构,然后再调用 GetDIBits()函数。不过,有些显示设备有可能不支持这个函数,你可以通过调用 GetDeviceCaps()函数来确定一下( GetDeviceCaps()函数在调用时指定 RC_DI_BITMAP 作为 RASTERCAPS 的标志)。应用程序可以用 DIB 去设置显示设备上的像素(译者注:也就是显示DIB),方法是调

9、用 SetDIBitsToDevice()函数或调用 StretchDIBits()函数。同样,有些显示设备也有可能不支持以上这两个函数,这时你可以指定RC_DIBTODEV 作为RASTERCAPS 标志,然后调用 GetDeviceCaps()函数来判断该设备是否支持SetDIBitsToDevice()函数。也可以指定 RC_STRETCHDIB 作为 RASTERCAPS 标志来调用 GetDeviceCaps()函数,来判断该设备是否支持StretchDIBits()函数。如果应用程序只是要简单的显示一个已经存在的DIB 位图,那么它只要调用SetDIBitsToDevice()函数

10、就可以。比如一个电子表格软件,它可以打开一个图表文件,在窗口中简单的调用 SetDIBitsToDevice()函数,将图形显示在窗口中。但如果应用程序要重复的绘制位图的话,则应该使用BitBlt()函数,因为 BitBlt()函数的执行速度要比 SetDIBitsToDevice()函数快很多。设备相关位图 (Device-Dependent Bitmaps)设备相关位图( DDB)之所以现在还被系统支持,只是为了兼容旧的Windows 3.0 软件,如果程序员现在要开发一个与位图有关的程序,则应该尽量使用或生成DIB 格式的位图。DDB 位图是被一个单个结构 BITMAP 所描述,这个结构

11、的成员标明了该位图的宽度、高度、设备的颜色格式等信息。DDB 位图也有两种类型,即:可废弃的 (discardable)DDB 和不可废弃的(nondiscardable)DDB。可废弃的 DDB 位图就是一种当系统内存缺乏,并且该位图也没有被选入设备描述表( DC)的时候,系统就会把该 DDB 位图从内存中清除(即废弃)。不可废弃的 DDB 则是无论系统内存多少都不会被系统清除的DDB。API 函数CreateDiscardableBitmap()函数可用于创建可废弃位图。而函数CreateBitmap()、CreateCompatibleBitmap()、和 CreateBitmapInd

12、irect()可用于创建不可废弃的位图。应用程序可以通过一个 DIB 位图而创建一个 DDB 位图,只要先初始化一些必要的结构,然后再调用 CreateDIBitmap()函数就可以。如果在调用该函数时指定了CBM_INIT 标志,那么这一次调用就等价于先调用CreateCompatibleBitmap()创建当前设备格式的 DDB 位图,然后又调用 SetDIBits()函数转换 DIB 格式到 DDB 格式。(可能有些设备并不支持 SetDIBits()函数,你可以指定 RC_DI_BITMAP 作为RASTERCAPS 的标志,然后调用 GetDeviceCaps()函数来判断一下)。对

13、对应应的的数数据据结结构构1:BMP 文件组成BMP 文件由文件头、位图信息头、颜色信息和图形数据四部分组成。2:BMP 文件头(14 字节)BMP 文件头数据结构含有 BMP 文件的类型、文件大小和位图起始位置等信息。其结构定义如下 :typedef struct tagBITMAPFILEHEADERWORD bfType; / 位图文件的类型,必须为 BM(0-1 字节)DWORD bfSize; / 位图文件的大小,以字节为单位 (2-5 字节)WORD bfReserved1; / 位图文件保留字,必须为 0(6-7 字节)WORD bfReserved2; / 位图文件保留字,必须

14、为 0(8-9 字节)DWORD bfOffBits; / 位图数据的起始位置,以相对于位图 (10-13 字节)/ 文件头的偏移量表示,以字节为单位 BITMAPFILEHEADER;3:位图信息头 (40 字节)BMP 位图信息头数据用于说明位图的尺寸等信息。typedef struct tagBITMAPINFOHEADERDWORD biSize; / 本结构所占用字节数 (14-17 字节)LONG biWidth; / 位图的宽度,以像素为单位 (18-21 字节)LONG biHeight; / 位图的高度,以像素为单位 (22-25 字节)WORD biPlanes; / 目标

15、设备的级别,必须为 1(26-27 字节)WORD biBitCount;/ 每个像素所需的位数,必须是1(双色),(28-29 字节)/ 4(16 色),8(256 色)或 24(真彩色)之一DWORD biCompression; / 位图压缩类型,必须是 0(不压缩),(30-33 字节)/ 1(BI_RLE8 压缩类型)或 2(BI_RLE4 压缩类型)之一DWORD biSizeImage; / 位图的大小,以字节为单位 (34-37 字节)LONG biXPelsPerMeter; / 位图水平分辨率,每米像素数 (38-41 字节)LONG biYPelsPerMeter; /

16、位图垂直分辨率,每米像素数 (42-45 字节)DWORD biClrUsed;/ 位图实际使用的颜色表中的颜色数 (46-49 字节)DWORD biClrImportant;/ 位图显示过程中重要的颜色数 (50-53 字节) BITMAPINFOHEADER;4:颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD 类型的结构,定义一种颜色。 RGBQUAD 结构的定义如下 :typedef struct tagRGBQUAD BYTE rgbBlue;/ 蓝色的亮度 (值范围为 0-255)BYTE rgbGreen; / 绿色的亮度 (值范围为 0-255)BYTE rgbRed; / 红色的亮度 (值范围为 0-255)BYTE rgbReserved;/ 保留,必须为 0 RGBQUAD;颜色表中 RGBQUAD 结构数据的个数有 biBitCount 来确定:当 biBitCount=1,4,8 时,分别有 2,16,256 个表项;当 biB

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号