CreateBitmapSourceFromHBitmap() を使用する場合の WPF でのメモリ リークへの対処
WPF アプリケーションで画像をピクセルごとに生成するときに頻繁に発生する問題は、CreateBitmapSourceFromHBitmap()
を System.Drawing.Bitmap
に変換するために BitmapSource
を使用することによって発生します。 GDI ビットマップ オブジェクトのメモリはアプリケーションが終了するまで自動的に解放されないため、この変換はメモリ リークにつながることがよくあります。
解決策: 適切なリソース管理
Bitmap.GetHbitmap()
に関する Microsoft のドキュメントには、開発者が DeleteObject
メソッドを使用して GDI ビットマップ オブジェクトのメモリを手動で解放する必要があると明確に記載されています。この重要なステップは、メモリの蓄積を防ぎます。
次のコード例は、正しいメモリ管理手法を示しています。
<code class="language-csharp">// Import DeleteObject from gdi32.dll [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); // Use a using statement for proper resource disposal 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
ステートメントは、例外が発生した場合でも、System.Drawing.Bitmap
オブジェクトが適切に破棄されることを保証します。 これと DeleteObject
の明示的な呼び出しと組み合わせることで、GDI リソースの解放が保証され、メモリ リークが防止されます。 このベスト プラクティスは、堅牢で効率的な WPF アプリケーションを作成するために不可欠です。
以上がWPF の CreateBitmapSourceFromHBitmap() を使用するときにメモリ リークを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。