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