1. 程式人生 > >CBitmap轉換成GDI+的Bitmap (Image)

CBitmap轉換成GDI+的Bitmap (Image)

   GDI物件與裝置描述表(DC)息息相關,裝置描述表是Windows使用的一個數據結構,用於儲存具體裝置能力和與如何在裝置上重繪一些專案的有關屬性資訊。而且視訊裝置的裝置描述表還與特定的視窗有關。首先你必須獲得一個裝置描述表控制代碼,然後在圖形繪製時,你把這個控制代碼作為一個引數傳遞給GDI圖形繪製函式。當然你也可以把它傳遞給獲得或設定裝置描述表有關屬性的函式。

   而GDI+物件,你不必使用控制代碼或者裝置描述表。相反,只是簡單地建立一個圖形對(Graphics),然後以你熟悉的面向物件的程式設計方式呼叫它的方法即可,譬如myGraphicsObject.DrawLine(parameters),

 Graphics物件是GDI+的核心,正如裝置描述表是GDI的核心一樣,裝置描述表(DC)和圖形物件(Graphics)在不同的環境下扮演著同樣的角色,發揮著類似的作用,但是兩者也存在著這質的不同.前者使用基於控制代碼的程式設計方法而後者使用面向物件的程式設計方法。

   GDI與GDI+作為微軟對影象處理先後產生的兩種解決方法,其之間的相容問題經常會出現,並且在不同的情況有各自的好處。因此GDI與GDI+之間的轉化尤為讓人頭疼,下面提供常見物件的轉化。

  1.  GDI+的Bitmap轉換為GDI的CBitmap:(核心部分是利用Bitmap類的成員函式GetHBITMAP獲得影象的基本資訊)

     //已有的Bitmap物件pBitmap,以及CDC物件pDC

     CBitmap* bmp;

     CDC   m_dcBmp;

     m_dcBmp.CreateCompatibleDC(&pDC); 
     HBITMAP hBitmap;
     pBitmap->GetHBITMAP(Color(0,0,0),&hBitmap);//佔用記憶體較多,
     bmp= CBitmap::FromHandle(hBitmap);

     m_dcBmp.SelectObject(bmp);//bmp物件獲得了pBitmap的所有資訊,CBitmap物件對應的裝置為m_dcBmp

  2.  GDI的CBitmap轉換為GDI+的Bitmap:(核心部分是利用Bitmap類的建構函式Bitmap::Bitmap(HBITMAP,HPALETTE)獲得CBitmap物件影象的基本資訊) 

     CBitmap* bmp=m_dcbmp.GetCurrentBitmap();
     HBITMAP  bmp_hbitmap=(HBITMAP)(*bmp);
      Bitmap   m_pBmp(bmp_hbitmap,NULL); 

首先通過MSDN文件查得Bitmap是Image的子類,所以我們用Bitmap來實現,最後強制把Bitmap轉成Image。看到網上有不少的人在問,好像答案挺少的。在這裡貼出來,僅兩行程式碼就可以實現嘍。

  1. void BitmapToImage(CBitmap *pBitmap,Image* &img)  
  2. {  
  3.     //拿到點陣圖的控制代碼 Bitmap是Image的子類
  4.     HBITMAP  hBmp = (HBITMAP)pBitmap->GetSafeHandle();  
  5.     //建立一個從點陣圖控制代碼的Bitmap點陣圖
  6.     img = new Bitmap(hBmp,NULL);  
  7. }  
  1. 下午在網上找了很久關於把資原始檔中的點陣圖匯入到gdi+的Bitmap物件中的方法,但是網上的方法不是要寫大段的程式碼,就是根本無法實現預期目標。最後通過我自己的嘗試發現了一個簡單易用的方法。就是先把點陣圖匯入到一個gdi物件CBitmap中然後通過其控制代碼載入到gdi+的Bitmap物件中。程式碼如下:  
  2. CBitmap bmp;  
  3. bmp.LoadBitmap(IDB_BITMAP1);  
  4. Bitmap bitmap((HBITMAP)bmp);  
  5. 僅三行程式碼就夠了!  

有了HBITMAP控制代碼和BITMAP,怎樣操作點陣圖資料?

2013-05-04 13:04AAMINI4  分類:VC++ | 瀏覽 824 次  軟體程式語言
HBITMAP hBitmap;
BITMAP  m_bmp;
GetObject(hBitmap,sizeof(m_bmp),&m_bmp);
現在怎樣修改點陣圖資料?
2013-05-04 19:41 提問者採納
哦你拿到HBITMAP了啊。

下一步你該看GetDIBits函數了

p.s. 我自己的話用的是gdi+不是gdi,所以GetDIBits其實我不熟
gdi+裡面拿到Bitmap物件以後是呼叫LockBits的