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
790 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!

source:php.cn
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