Lors du dessin d'une image: System.Runtime.InteropServices.ExternalException: une erreur générique s'est produite dans GDI
J'ai un mondial objet Graphique créé à partir d'un Panneau. À intervalles réguliers, une image est repris à partir du disque et dessiné dans le panneau à l'aide de Graphiques.DrawImage(). Il fonctionne très bien pour quelques itérations et puis je suis arriver la suite utile exception:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
at System.Drawing.Graphics.DrawImage(Image image, Point point)
J'ai exclu les fuites de mémoire que je me débarrasser de l'image de l'objet quand je suis fait avec elle. Je sais que les images ne sont pas endommagés et peuvent être lus beaux que le programme s'exécute parfaitement pendant un certain temps avant que la commission ne cesse de montrer.
J'ai rencontré le même problème lors de l'utilisation d'un contrôle PictureBox, mais cette fois au moins, j'ai une erreur au lieu de rien.
J'ai vérifié les objets GDI et des objets UTILISATEUR dans le Gestionnaire de Tâches, mais ils sont toujours autour de 65 objets utilisateur et 165 objets GDI lorsque l'application fonctionne et quand il n'est pas.
J'ai besoin d'aller au fond de ce dès que et il n'est pas comme je peux coller des points d'arrêt .NET Système de bibliothèques et de voir exactement où l'exécution échoue.
Merci d'avance.
MODIFIER: C'est l'affichage de code:
private void DrawImage(Image image)
{
Point leftCorner = new Point((this.Bounds.Width / 2) - (image.Width / 2), (this.Bounds.Height / 2) - (image.Height / 2));
_graphics.DrawImage(image, leftCorner);
}
le chargement de l'image de code:
private void LoadImage(string filename, ref Image image)
{
MemoryStream memoryStream = DecryptImageBinary(Settings.Default.ImagePath + filename, _cryptPassword);
image = Image.FromStream(memoryStream);
memoryStream.Close();
memoryStream.Dispose();
memoryStream = null;
}
_image est global et sa référence est mise à jour en LoadImage. Ils sont passés comme paramètres que je veux changer la référence globale à partir d'aussi peu d'endroits possible uniquement et de garder les autres méthodes autonome. _graphics est aussi mondiale.
J'ai aussi un contrôle webBrowser pour les sites web et je afficher une image ou un site web à la fois. quand il est temps d'afficher une image, il exécute le code suivant:
webBrowser.Visible = false;
panel.Visible = true;
DrawImage(_image)
_image.Dispose();
_image = null;
_image référence à une image préchargée.
Espère que cette aide.
source d'informationauteur Michali
Vous devez vous connecter pour publier un commentaire.
Votre problème est similaire à ce que je pensais, mais pas tout à fait. Lorsque vous êtes chargement de l'image, que vous le chargez à partir d'un MemoryStream. Vous devez conserver le flux ouvert pour la durée de vie de l'image, voir Image MSDN.FromStream.
La solution est de faire une copie de votre image dans la FromImage fonction:
Similaire à la dispose problème je l'ai mentionné, l'image aura l'air de fonctionner et puis ne pas aléatoire lorsque le flux sous-jacent est des ordures collectées.
Sans un peu plus de code, il n'est pas suffisant pour diagnostiquer correctement ici, cependant, une chose à regarder, c'est que vous pouvez avoir disposé sur l'image de votre un dessin, à un certain moment plus tôt et c'est seulement après le garbage collector s'exécute que votre code est un échec. Êtes-vous à l'aide cloné des images n'importe où? Une chose que j'ai été surpris d'apprendre, c'est que si tu fais un tout droit clone d'une image, vous n'êtes pas le clonage sous-jacents bitmap de l'image à compter du moment, seule la structure de l'image, pour créer une bonne copie d'une image, vous devez créer une nouvelle image:
comme
va travailler pour un certain temps, mais échouer à un point aléatoire...