1. 程式人生 > >裝置相關點陣圖(DDB)與裝置無關點陣圖(DIB) 的區別

裝置相關點陣圖(DDB)與裝置無關點陣圖(DIB) 的區別

裝置相關點陣圖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();  // 建立一個自定義的點陣圖

轉自:http://www.cnblogs.com/Jade2009/archive/2009/05/11/1454263.html