Maison > développement back-end > C++ > Comment puis-je éviter les fuites de mémoire lors de la création de WPF BitmapSource à partir de HBitmap ?

Comment puis-je éviter les fuites de mémoire lors de la création de WPF BitmapSource à partir de HBitmap ?

Linda Hamilton
Libérer: 2025-01-10 07:29:42
original
892 Les gens l'ont consulté

How Can I Prevent Memory Leaks When Creating WPF BitmapSource from HBitmap?

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 :

  1. Importez DeleteObject à partir de gdi32.dll : Ajoutez l'instruction d'importation nécessaire pour DeleteObject à vos déclarations au niveau de la classe.
  2. Envelopper la création d'un bitmap dans l'instruction Using : Utilisez une instruction using pour envelopper l'objet System.Drawing.Bitmap afin de supprimer automatiquement le sous-jacent. resources.
  3. Supprimer le handle HBitmap : Dans le bloc final de l'instruction using, appelez DeleteObject pour libérer le handle de l'objet bitmap GDI.

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);
    }
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal