首頁 > 後端開發 > C++ > 從 HBitmap 建立 WPF BitmapSource 時如何防止記憶體洩漏?

從 HBitmap 建立 WPF BitmapSource 時如何防止記憶體洩漏?

Linda Hamilton
發布: 2025-01-10 07:29:42
原創
790 人瀏覽過

How Can I Prevent Memory Leaks When Creating WPF BitmapSource from HBitmap?

從HBitmap 建立WPF BitmapSource 時出現記憶體洩漏

使用CreateBitmapSourceFromHBitmap() 在WPF 中處理不當。當重複呼叫此方法而不釋放 BitmapSource 記憶體時,記憶體利用率持續增加。

根本原因

問題源自於 Bitmap.GetHbitmap( ) 擷取 GDI 位圖物件的句柄。 MSDN明確指出必須使用GDI的DeleteObject方法釋放該句柄,以釋放關聯的記憶體資源。

解決方案

要修復記憶體洩漏,釋放記憶體至關重要從 Bitmap.GetHbitmap() 取得的句柄。應進行以下修改:

  1. 從 gdi32.dll 匯入 DeleteObject: 將 DeleteObject 所需的導入語句加入類別層級宣告中。
  2. 在Using語句中包裝位圖建立:使用using語句將System.Drawing.Bitmap物件包裝為自動釋放底層資源。
  3. 刪除HBitmap句柄:在using語句的finally區塊中,呼叫DeleteObject釋放GDI位圖物件的句柄。

範例程式碼

以下程式碼示範如何使用此方法:

// Import DeleteObject from gdi32.dll
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

// Your Code
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000)) 
{
    // Obtain HBitmap handle
    IntPtr hBitmap = bmp.GetHbitmap(); 

    try 
    {
        // Create BitmapSource using HBitmap (using statement handles GDI bitmap disposal)
        var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    }
    finally 
    {
        // Release HBitmap handle
        DeleteObject(hBitmap);
    }
}
登入後複製

透過實作這些變更,您可以有效防止記憶體洩漏並正確釋放與從HBitmap 建立的BitmapSource 關聯的資源。

以上是從 HBitmap 建立 WPF BitmapSource 時如何防止記憶體洩漏?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板