2024年3月26日发(作者:)
BMP图片格式
简介:
BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存
储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用
的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存
储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此
在Windows环境中运行的图形图像软件都支持BMP图像格式。
文件结构:
典型的BMP图像文件由四部分组成:
1:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义
颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真
彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24
位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
位图的类型:
位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。
DDB位图在早期的Windows系统(Windows 3.0以前)中是很普遍的,事实上它也
是唯一的。然而,随着显示器制造技术的进步,以及显示设备的多样化,DDB位
图的一些固有的问题开始浮现出来了。比如,它不能够存储(或者说获取)创建
这张图片的原始设备的分辨率,这样,应用程序就不能快速的判断客户机的显示
设备是否适合显示这张图片。为了解决这一难题,微软创建了DIB位图格式。
设备无关位图 (Device-Independent Bitmap)
DIB位图包含下列的颜色和尺寸信息:
* 原始设备(即创建图片的设备)的颜色格式。
* 原始设备的分辨率。
* 原始设备的调色板
* 一个位数组,由红、绿、蓝(RGB)三个值代表一个像素。
* 一个数组压缩标志,用于表明数据的压缩方案(如果需要的话)。
以上这些信息保存在BITMAPINFO结构中,该结构由BITMAPINFOHEADER结构
和两个或更多个RGBQUAD结构所组成。BITMAPINFOHEADER结构所包含的成员表
明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案等信息。RGBQUAD结
构标识了像素所用到的颜色数据。
DIB位图也有两种形式,即:底到上型DIB(bottom-up),和顶到下型
DIB(top-down)。底到上型DIB的原点(origin)在图像的左下角,而顶到下型DIB
的原点在图像的左上角。如果DIB的高度值(由BITMAPINFOHEADER结构中的
biHeight成员标识)是一个正值,那么就表明这个DIB是一个底到上型DIB,如
果高度值是一个负值,那么它就是一个顶到下型DIB。注意:顶到下型的DIB位
图是不能被压缩的。
位图的颜色格式是通过颜色面板值(planes)和颜色位值(bitcount)计算得
来的,颜色面板值永远是1,而颜色位值则可以是1、4、8、16、24、32其中的
一个。如果它是1,则表示位图是一张单色位图(译者注:通常是黑白位图,只
有黑和白两种颜色,当然它也可以是任意两种指定的颜色),如果它是4,则表
示这是一张VGA位图,如果它是8、16、24、或是32,则表示该位图是其他设备
所产生的位图。如果应用程序想获取当前显示设备(或打印机)的颜色位值(或
称位深度),可调用API函数GetDeviceCaps(),并将第二个参数设为BITSPIXEL
即可。
显示设备的分辨率是以每米多少个像素来表明的,应用程序可以通过以下三
个步骤来获取显示设备或打印机的水平分辨率:
1. 调用GetDeviceCaps()函数,指定第二个参数为HORZRES。
2. 再次调用GetDeviceCaps()函数,指定第二个参数为HORZSIZE。
3. 用第一个返回值除以第二个返回值。即:
DetDeviceCaps(hDC,HORZRES)/GetDeviceCaps(hDC,HORZSIZE);
应用程序也可以使用相同的三个步骤来获取设备的垂直分辨率,不同之处只
是要将HORZRES替换为VERTRES,把HORZSIZE替换为VERTSIZE,即可。
调色板是被保存在一个RGBQUAD结构的数组中,该结构指出了每一种颜色的
红、绿、蓝的分量值。位数组中的每一个索引都对应于一个调色板项(即一个
RGBQUAD结构),应用程序将根据这种对应关系,将像素索引值转换为像素RGB
值(真实的像素颜色)。应用程序也可以通过调用GetDeviceCaps()函数来获取
当前显示设备的调色板尺寸(将该函数的第二个参数设为NUMCOLORS即可)。
Win32 API支持位数据的压缩(只对8位和4位的底到上型DIB位图)。压
缩方法是采用运行长度编码方案(RLE),RLE使用两个字节来描述一个句法,第
一个字节表示重复像素的个数,第二个字节表示重复像素的索引值。有关压缩位
图的详细信息请参见对BITMAPINFOHEADER结构的解释。
应用程序可以从一个DDB位图创建出一个DIB位图,步骤是,先初始化一些
必要的结构,然后再调用GetDIBits()函数。不过,有些显示设备有可能不支持
这个函数,你可以通过调用GetDeviceCaps()函数来确定一下(GetDeviceCaps()
函数在调用时指定RC_DI_BITMAP作为RASTERCAPS的标志)。
应用程序可以用DIB去设置显示设备上的像素(译者注:也就是显示DIB),
方法是调用SetDIBitsToDevice()函数或调用StretchDIBits()函数。同样,有
些显示设备也有可能不支持以上这两个函数,这时你可以指定RC_DIBTODEV作为
RASTERCAPS标志,然后调用GetDeviceCaps()函数来判断该设备是否支持
SetDIBitsToDevice()函数。也可以指定RC_STRETCHDIB作为RASTERCAPS标志来
调用GetDeviceCaps()函数,来判断该设备是否支持StretchDIBits()函数。
如果应用程序只是要简单的显示一个已经存在的DIB位图,那么它只要调用


发布评论