ホームページ >バックエンド開発 >C++ >WPF で CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを防ぐにはどうすればよいですか?

WPF で CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを防ぐにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 10:36:41487ブラウズ

How Can I Prevent Memory Leaks When Using CreateBitmapSourceFromHBitmap() in WPF?

CreateBitmapSourceFromHBitmap() を使用する場合の WPF でのメモリ リークへの対処

WPF アプリケーションは、ピクセルごとに生成された画像を頻繁に表示します。 一般的なアプローチには、System.Drawing.Bitmap を使用し、それを BitmapSource 経由で CreateBitmapSourceFromHBitmap() に変換することが含まれます。 ただし、この方法は慎重に扱わないとメモリ リークを引き起こす可能性があります。

問題の根源

核心的な問題は GetHbitmap() から生じています。この関数は、Windows オペレーティング システムによってメモリが管理される GDI ビットマップ オブジェクトを返します。 重要なのは、このメモリは DeleteObject() を使用して明示的に解放する必要があることです。 これを行わないと、CreateBitmapSourceFromHBitmap() を呼び出すたびにメモリが蓄積されてしまいます。

解決策: 適切なリソース管理

メモリ リークを防ぐには、BitmapSource を作成した後に GDI ビットマップ オブジェクトを正しく破棄することが重要です。 次のコードは、正しいアプローチを示しています:

<code class="language-csharp">// Import the DeleteObject() method
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

// Code to create and dispose of the Bitmap
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(1000, 1000))
{
    IntPtr hBitmap = bmp.GetHbitmap();

    try
    {
        var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        // Use the 'source' BitmapSource here...
    }
    finally
    {
        DeleteObject(hBitmap);
    }
}</code>

安全性を高めるための using ステートメントの使用

using ステートメントは、リソースを管理するためのよりクリーンで安全な方法を提供し、例外が発生した場合でも確実に自動的に破棄されます。

これらの手法を採用すると、CreateBitmapSourceFromHBitmap() に関連するメモリ リークを効果的に排除し、WPF アプリケーション内で最適なメモリ管理を維持できます。

以上がWPF で CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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