设备相关位图(DDB)与设备无关位图(DIB) 的区别

时间:2022-10-04 05:55:36

设备相关位图 DDB(Device-Dependent-Bitmap)

    DDB不具有自己的调色板信息,他的颜色模式必须与输出设备相一致。如:在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。

设备无关位图DIB(Device-Independent-Bitmap)

    DIB具有自己的调色板信息,他可以不依赖系统的调色板。由于他不依赖于设备,所以通常用它来保存文件,如.bmp格式的文件就是DIB.

 

HBITMAP与BITMAP的区别

BITMAP 是一个结构:  
   
  typedef   struct   tagBITMAP   {     /*   bm   */  
          int           bmType;  
          int           bmWidth;  
          int           bmHeight;  
          int           bmWidthBytes;  
          BYTE         bmPlanes;  
          BYTE         bmBitsPixel;  
          LPVOID     bmBits;  
  }   BITMAP;   

HBITMAP  是一个指向BITMAP的句柄

  HBITMAP   HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
  BITMAP   bm;  
  GetObject(hBmp,sizeof(bm),&bm);  可以通过该函数 由HBITMAP取得BITMAP;

如何通过BITMAP构造一个.bmp格式的文件

        LoadImage从磁盘中读取.bmp文件转换成了易于系统操作的HBITMAP文件,但很多时候又需要将BITMAP数据存储下来,如:存储,D3DXCreateTextureFromFileInMemory()需要严格的.bmp格式的数据才行;

  构建BITMAPFILEHEADER  bfileh; 并填充;构建BITMAPINFOHEADER binfoh并填充;

  将上述两者数据和BITMAP.bmBits的数据拷贝到一个缓冲区即可;

 memcpy( buffer, sizeof(BITMAPFILEHEADER), bfileh);

memcpy( &buffer[sizeof(BITMAPFILEHEADER)], sizeof(BITMAPINFOHEADER), binfoh);

memcpy( &buffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)],  图形数据区字节长度, bitmap.bmBits);

 

其他一些DIB,DDB有用的函数:

GetDIBits();          // 获取HBITMAP的自定数据区,要自己拿个空间去接受这些数据;

GetBitmapBits();   // 获取HBITMAP中bitmap的指定数据区

CreateDIBSection();  // 创建一个自定义的位图