2009-07-23 114 views
2

如何將類似於位圖的結構轉換爲HDC?如何將gdi +類似於位圖的結構轉換爲HDC?

我現在正在用C++編寫圖像處理程序,gdi。

如果我有HDC。 我可以通過下面的代碼在gdi上繪製任何我喜歡的東西。

// HDC is handy. 
HDC dc; 
dc.DrawXXX  // I can draw using gdi method. 
Graphics gr(dc); // now I can also draw on the dc using gdi+ method. 

我的應用程序基於FreeImage。 我製作的fipImage。 (如位圖使用的數據結構)

但是如果我想借鑑fipWinImage,現在我要複製fipWinImageto位圖,然後繪製的位圖,最後將位圖再次轉換成fipImage,這是時花費時間和內存comsuming 。

轉換fipImage爲位圖 - >對位圖繪製 - >轉換位圖fipWinImage

fipWinImage imagefip; 
Bitmap* tempImg = new Bitmap(imagefip->GetWidth(), imagefip.GetHeigt(), PixelFormat24bppRGB); // memory comsuming is image is large 
Graphics *pGr = Graphics::FromImage(tempImg); 

HDC dc = pGr->GetHDC(); 

RECT rec; 
rec.left = 0; 
rec.top = 0; 
rec.right = imagefip.GetWidth(); 
rec.bottom = imagefip.GetHeight(); 
fipImage.draw(dc, rec); // using stretchdibits() 
pGr->ReleaseHDC(dc); 

Graphics gr(tempImg); 
HDC dc = gr.GetHDC();   // Get an Hdc, draw using gdi method 
gr.ReleaseHDC(tempDC);  // 
gr.drawXXX       // Draw using gdi+ method. 


fipWinImage fipImg;    // final result fipWinImage. 
HBITMAP temp; 
Color color; 
tempImg->GetHBITMAP(color, &temp); 
fipImg->copyFromBitmap(temp); 

我想直接從fipImage構建一個HDC。並直接在fipWinImage上畫圖 我該怎麼做?

回答

0

我不知道FreeImage,但是如果你能得到一個指向實際像素數據(DIB部分)的指針,你就可以創建一個HBITMAP來分享它,而不必每次都複製數據。

2

首先幾個澄清:

設備上下文基本上是記住之類的東西前景和背景顏色,畫筆,字體信息,和物理繪圖表面(位圖)的結構。

這是一個非常方便的事情,因此,當您一個接一個地進行圖形操作時,您不必指定所有這些東西。您也可以通過這種方式更簡單地傳遞所有這些設置。這就是DC的真正意義 - 只是繪圖參數的集合,包括要繪製的曲面。

「HDC」只是其中一個結構的句柄(參考)。作爲一個「句柄」可以讓窗口在內存中移動結構來管理空閒空間,而不會讓你的指針變得混亂。

如果您有權訪問正在使用的庫的源代碼,請檢查fipWinImage :: draw(...)方法。如果他們使用StretchDIBits,那麼他們必須在某個時刻將其原始位圖數據轉換爲兼容格式。這也有可能是fipWinImage類包裝底層位圖或DIB等

的最後一步,讓你的自己的HDC ...

一個位圖「入選」到設備上下文,也只能一次選入一個DC。如果您可以從fipWinImage獲取內部HBITMAP,則可以將其選擇到另一個DC(假定它尚未被選入另一個HC)。

創建DC時,Windows會自動爲其創建1x1位圖(因爲DC必須始終具有選定的位圖)。當你選擇一個新的位圖時,你會得到返回給你的先前選擇的位圖的句柄。堅持下去,因爲當你完成後你需要把它放回去。

希望有所幫助。