设备相关位图
  在Windows中有两种类型的位图:DDB位图(与设备相关位图)及DIB位图(与设备无关位图).与设备相关位图(DDB)是一种内部位图格式,它由MFC库6.0版本CBitmap类定义,有一个与之关联的Windows数据结构.
  DDB中不包括颜色信息,显示时是以系统的调色板为基础进行各位的颜色映射.例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的。在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储文件.
  MFC6.0定义了Cbitmap类和DDB结构BITMAP 对DDB位图操作进行了封装.结构BITMAP定义了DDB位图的类型宽度高度颜色格式和像素位置,其在Windows中定义如下:
  typedef struct tagBITMAP
  {
  int bmType; //位图类型,必须设置为0
  int bmWidth; //位图宽度
  int bmHeight; //位图高度
  int bmWidthBytes; //位图中每一扫描行中的字节数
  BYTE bmPlanes; //颜色层数
  BYTE bmbitsPixel; //每一像素所占的位数
  void FAR* bmbits; //存放像素值内存块的地址
  }BITMAP;

  在数字图像处理中,使用较多的DIB位图,即与设备无关位图,DDB位图使用较少

DDB的创建
MFC的CBitmap类封装了DDB。该类提供了几个函数用来创建DDB:
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
该函数从资源中载入一幅位图,若载入成功则返回TRUE。资源位图实际上是一个DIB,该函数在载入时把它转换成了DDB。

BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );
该函数用来创建一幅空白的DDB。参数nWidth和nHeight以像素为单位说明了位图的宽度和高度。nPlanes是DDB的色平面数,nBitcount是每个色平面的颜色位数。一般来说,nPlanes为1,而nBitcount代表DDB中每个像素值所占的位数,但在创建16色DDB时,nPlanes为4,而nBitcount为1。参数lpBits指向存储像素阵列的数组,该数组应该逐行存储位图的每个像素值。注意,数组中每行像素的数目必需是偶数个字节,如果是奇数,则应该用0补足。若创建成功函数返回TRUE。

BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight );
该函数创建一个与指定设备上下文兼容的DDB。参数pDC指向一个设备上下文,nWidth和nHeight是DDB的尺寸。若创建成功函数返回TRUE


设备无关位图

DIB设备无关位图文件,这是一种文件格式,是为了保证用某个应用程序创建的位图图形可以被其它应用程序装载或显示一样。 DIB的与设备无关性主要体现在以下两个方面DIB的颜色模式与设备无关。例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。运行在不同输出设备下的应用程序可以通过DIB来交换图象。

DIB可以存储在*.BMP或*.DIB文件中。



DIB文件是以BITMAPFILEHEADER结构开头的 


typedef struct tagBITMAPFILEHEADER {
WORD bfType; //文件类型,必须为"BM"
DWORD bfSize; //文件的大小
WORD bfReserved1; //为0
WORD bfReserved2; //为0
DWORD bfOffBits; //存储的像素阵列相对于文件头的偏移量
} BITMAPFILEHEADER;
      
       紧随该结构的是一个BITMAPINFOHEADER结构,然后是RGBQUAD结构组成的颜色表(如果有的话),文件最后存储的是DIB的像素阵列。
  DIB的颜色信息储存在自己的颜色表中,程序一般要根据颜色表为DIB创建逻辑调色板。在输出一幅DIB之前,程序应该将其逻辑调色板选入到相关的设备上下文中并实现到系统调色板中,然后再调用相关的GDI函数(如::SetDIBitsToDevice或::StretchDIBits)输出DIB。在输出过程中,GDI函数会把DIB转换成DDB,这项工作主要包括以下两步:
  将DIB的颜色格式转换成与输出设备相同的颜色格式。例如,在真彩色的显示模式下要显示一个256色的DIB,则应该将其转换成24位的颜色格式。
       将DIB像素的逻辑颜色索引转换成系统调色板索引


posted on 2011-04-09 11:42  maxweii  阅读(1631)  评论(0编辑  收藏  举报