Fuite de mémoire dans la création WPF BitmapSource à partir de HBitmap
La création d'images pixel par pixel dans WPF à l'aide de CreateBitmapSourceFromHBitmap() peut entraîner des fuites de mémoire s'il n'est pas manipulé correctement. Lorsque cette méthode est appelée à plusieurs reprises sans libérer la mémoire BitmapSource, l'utilisation de la mémoire continue d'augmenter.
Cause sous-jacente
Le problème vient du fait que Bitmap.GetHbitmap( ) récupère un handle vers un objet bitmap GDI. MSDN indique explicitement que ce handle doit être libéré à l'aide de la méthode DeleteObject de GDI pour libérer les ressources mémoire associées.
Solution
Pour remédier à la fuite mémoire, il est crucial de libérer le handle obtenu à partir de Bitmap.GetHbitmap(). Les modifications suivantes doivent être apportées :
Exemple Code
Le code suivant montre comment l'utiliser approche :
// 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); } }
En implémentant ces changements, vous pouvez prévenir efficacement la fuite de mémoire et libérer correctement les ressources associées au BitmapSource créé à partir d'un HBitmap.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!