ホームページ >バックエンド開発 >C++ >HBitmap から WPF BitmapSource を作成するときにメモリ リークを防ぐにはどうすればよいですか?

HBitmap から WPF BitmapSource を作成するときにメモリ リークを防ぐにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 07:29:42793ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。