WPF CreateBitmapSourceFromHBitmap() fuite de mémoire
J'ai besoin de dessiner une image pixel par pixel et de l'afficher à l'intérieur d'un WPF. Je tente de le faire en utilisant un System.Drawing.Bitmap
puis à l'aide de CreateBitmapSourceFromHBitmap()
pour créer un BitmapSource
pour WPF contrôle de l'Image. J'ai une fuite de mémoire quelque part parce que lors de la CreateBitmapSourceFromBitmap()
est appelé à plusieurs reprises l'utilisation de la mémoire monte et ne descend pas jusqu'à ce que la demande est terminée. Si je n'appelle pas CreateBitmapSourceFromBitmap()
il n'y a pas de changement notable dans l'utilisation de la mémoire.
for (int i = 0; i < 100; i++)
{
var bmp = new System.Drawing.Bitmap(1000, 1000);
var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
source = null;
bmp.Dispose();
bmp = null;
}
Que puis-je faire pour libérer de la BitmapSource
mémoire?
Vous devez vous connecter pour publier un commentaire.
MSDN pour
Bitmap.GetHbitmap()
états:Donc utiliser le code suivant:
J'ai aussi remplacé votre
Dispose()
appel par unusing
déclaration.Chaque fois que de traiter avec non géré poignées, il peut être une bonne idée d'utiliser la "sécurité de la poignée" wrappers:
Construire un, comme dès que vous la surface de la poignée (idéalement, votre Api ne serait jamais exposer IntPtr, ils seraient toujours retourner sûr poignées):
Et de l'utiliser comme ceci:
La SafeHandle de la base de donne vous une automatique jetable/finaliseur modèle, tout ce que vous devez faire est de remplacer le ReleaseHandle méthode.
J'ai eu la même exigence et le problème (fuite de mémoire). J'ai mis en place la même solution que marqué comme réponse. Mais, bien que la solution fonctionne, il a provoqué une inacceptable frappé à la performance. En cours d'exécution sur un i7, mon appli de test vu une constante de 30 à 40% de CPU, 200-400 MO de RAM augmente et que le garbage collector a été en cours d'exécution presque à chaque milliseconde.
Depuis que je suis en train de faire du traitement de la vidéo, je suis dans le besoin de bien meilleures performances. Je suis venu avec le suivant, donc pensé que je voudrais partager.
Réutilisables Objets Globaux
Code De Conversion
Exemple De Mise En Œuvre
Le résultat est une constante de 10 à 13% de CPU, 70-150 MO de RAM, et le garbage collector seulement couru deux fois en 6 minutes.
C'est un grand(!!) post, bien qu'avec tous les commentaires et suggestions, il m'a fallu une heure pour comprendre les pièces. Voici donc un appel pour obtenir le BitMapSource avec SafeHandles, puis un exemple d'utilisation de l'informatique pour créer un .Fichier image PNG. Tout en bas, sont les "usage" et certaines des références. Bien sûr, aucun crédit, c'est moi, je suis juste le scribe.
Ici est l'utilisation, et aussi la "Sécurité Poignée de" classe:
Et enfin un coup d'oeil à mon 'l'usage':
La Dll référencé inclus:
* PresentationCore
* Le système.De base
* Le système.Déploiement
* Le système.Dessin
* WindowsBase
Screen.AllScreens.Min/Max
) peut être remplacé parSystemParameters.VirtualScreenLeft/Top/Width/Height
. Ceci élimine le besoin de Système de référence.De Windows.Les formes, ce qui n'est pas partie de WPF, et rend le code plus rapide, surtout lorsque vous disposez de plusieurs écrans.J'ai une solution pour quelqu'un qui veut charger une image à partir de la mémoire ou d'autres classe
Puis-je utiliser le jeu de la source d'une image
Image est la définition suivante