2016-04-22 67 views
-1

我使用CreateDIBSection創建了一個位圖並指定了.biWidth = 100; .biHeight = 100這樣的僞代碼:更改位圖大小而不創建新的位圖

pBitmapInfo->bmiHeader.biWidth = 100; 
pBitmapInfo->bmiHeader.biHeight = 100; 
.... 
CreateDIBSection(DibDC, pBitmapInfo, DIB_RGB_COLORS, 0, 0, 0); 

後,我想重用此位圖,只是改變了位圖尺寸大小爲300x100(和可以清除舊的圖像,因爲我並不需要它了)。很多人說我需要用新的尺寸創建一個新的位圖並刪除舊的位圖。但我預計在某些方面我們可以重新使用舊的位圖。我不想重新創建一個新的位圖,因爲它會導致性能下降,而我需要重複執行多次。那麼有什麼方法可以在不重新創建新位圖的情況下更改位圖大小?

+0

如果您需要兩種尺寸的位圖,我會創建兩個位圖。調整大小可能看起來不好。您不需要重複創建任何內容,只需在需要時讓每個位圖「存活」即可。 –

+0

你在使用哪種環境?當然不是所有的VB/C/C++/Delphi ....我建議刪除所有這些標籤,並簡單地添加'WinAPI'。 – Johan

+0

與字符串類似,位圖是不可變的。一旦創建,它們就不能被修改。但是,您可以執行的操作是僅顯示部分位圖,或者使用「StretchBlt」對其進行拉伸。 – IInspectable

回答

0

如果您擔心性能,繼續銷燬和創建位圖確實不是一個好主意。

然而有一個更簡單的解決方案。只需按預定義的大小創建一個位圖池,並根據需要使用池中的位圖。

如果你有一個長期生活DC,您可以使用:

hBitmap100x100 = CreateCompatibleBitmap(MyDC, 100,100); 
hBitmap300x300 = CreateCompatibleBitmap(MyDC, 300,300); 

如果你不斷改變DC的然後使用DIB節

hBitmap100x100 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 
hBitmap300x300 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 

只要繼續重用這一遍又一遍。
如果你願意的話,你甚至可以在數組中放入其中的一打。
您可以在程序啓動時創建它們,並在完成時處理它們。

+0

'MyDC'是一個臨時資源,在執行過程中會經常變化(有時候根本不存在);這些位圖必須是DIB部分,不兼容位圖。 – andlabs

+0

非常感謝你Johan,我很欣賞這種替代方法。我已經初步測試,發現這種方法顯着提高我的表現。在將此答案標記爲最佳答案之前,我正在進行更多測試。 – DucFabulous