|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : OutOfMemoryException quand je fait Graphics.FromImage [ Windows / Autre ] (FPell)
Informations & options pour cette discussion
lundi 10 novembre 2008 à 02:20:29 |
OutOfMemoryException quand je fait Graphics.FromImage

FPell
|
J'ai un programme qui sert à modifier une image et ajouter du texte dessus et il supporte l'opération annuler. Mais quand je clone l'image originale (pour pouvoir annuler ensuite), quand je fais Graphics.FromImage pour modifier l'image, j'ai une exception OutOfMemoryException qui est lancée. Notez que je fait Graphics.FromImage à partir de l'image originale, et non pas à partir de la copie (clone). Voici un code très simplifié qui montre le bogue que j'ai : using System; using System.Drawing; using System.Windows.Forms; using System.IO;
namespace TestImage { /// /// Description résumée de Form1. /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Button btnLoad; private System.Windows.Forms.OpenFileDialog openFileDialog1; /// /// Variable nécessaire au concepteur. /// private System.ComponentModel.Container components = null;
public Form1() { // // Requis pour la prise en charge du Concepteur Windows Forms // InitializeComponent();
// // TODO : ajoutez le code du constructeur après l'appel à InitializeComponent // }
/// /// Nettoyage des ressources utilisées. /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }
#region Code généré par le Concepteur Windows Form /// /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas /// le contenu de cette méthode avec l'éditeur de code. /// private void InitializeComponent() { this.btnLoad = new System.Windows.Forms.Button(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.SuspendLayout(); // // btnLoad // this.btnLoad.Anchor = System.Windows.Forms.AnchorStyles.None; this.btnLoad.Location = new System.Drawing.Point(72, 128); this.btnLoad.Name = "btnLoad"; this.btnLoad.Size = new System.Drawing.Size(152, 23); this.btnLoad.TabIndex = 0; this.btnLoad.Text = "Load And Clone Image"; this.btnLoad.Click += new System.EventHandler(this.btnLoad_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.btnLoad); this.Name = "Form1"; this.ResumeLayout(false);
} #endregion
/// /// Point d'entrée principal de l'application. /// [STAThread] static void Main() { Application.Run(new Form1()); }
private void btnLoad_Click(object sender, System.EventArgs e) { openFileDialog1.ShowDialog(this); String strFileName = openFileDialog1.FileName; if (strFileName.Length > 0) CloneAndGetGraphicsFromOriginalImage(strFileName); }
private void CloneAndGetGraphicsFromOriginalImage(String strFileName) { FileStream stream = File.Open(strFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); Image OriginalImage = Image.FromStream(stream); stream.Close();
//Si j'enlève cette ligne-ci, tout fonctionnerait bien (mais dans ma vrai application j'en ai de besoin pour permettre d'annuler) Image imgClone = (Image)(OriginalImage.Clone()); // Avec cette ligne, la ligne suivante va lancer un OutOfMemoryException
Graphics g = Graphics.FromImage(OriginalImage); // <-- Lance un OutOfMemoryException, quand l'image a été cloné.
g.DrawString("test", DefaultFont, new SolidBrush(Color.Black), 0, 0); this.BackgroundImage = OriginalImage; } } }
|
|
|
lundi 10 novembre 2008 à 12:43:42 |
Re : OutOfMemoryException quand je fait Graphics.FromImage

Lutinore
|
Salut, ne ferme pas le stream ou utilise une autre méthode pour charger l'image.
|
|
|
lundi 10 novembre 2008 à 14:40:45 |
Re : OutOfMemoryException quand je fait Graphics.FromImage

xmox667
|
Réponse acceptée !
Salut, Moi j'utilise ceci pour charger mes images:
public Bitmap ImageFromFile(string filename) { FileStream Stream = File.Open(filename , FileMode.Open); Bitmap Image = new Bitmap(Stream,true); Stream.Close(); return Image; } A+
|
|
|
mardi 11 novembre 2008 à 01:35:18 |
Re : OutOfMemoryException quand je fait Graphics.FromImage

FPell
|
Réponse acceptée !
Merci beaucoup, en effet ça fonctionne très bien avec Image OriginalImage = Image.FromStream(stream, true); Le dernier paramètre True semble important quand on ferme le stream.
|
|
|
mardi 11 novembre 2008 à 22:30:41 |
Re : OutOfMemoryException quand je fait Graphics.FromImage

olibara
|
Réponse acceptée !
Tres intéressant !
J'avais un problème similaire ! Il semble en effet que la gestion du buffer image reponde a des regles un peu floues
J'avais remarqué que pour exploiter les property items il fallait
1- Soit les lires AVANT la fermeture du fichier 2- Soit en lire un qulquonque avant de fermer le fichier 3- Si une des ces deux operations a été faites il restent consistant APRES la fermeture SINON ca pete !
Mais ton post vient de me faire découvrir les option complementaires de la methode FromStream qui vont forcer le lock du buffer data FromStream(stream,bool,bool);
Creates an Image from the specified data stream, optionally using embedded color management information and validating the image data.
|
|
|
Cette discussion est classé dans : windows, system, image, forms, btnload
Répondre à ce message
Sujets en rapport avec ce message
L'exception System.AccessViolationException n'a pas été gérée [ par Caliberdev ]
Bonjour,J'ai Microsoft Visual Studio 2008 installé. Le projet C# ne veut pas se lancer subitement en mode Deboggage et m'affiche le message suivant:L'
Gérer une virgule dans un textbox [ par ammany ]
Salut , je voudrais gérer une petite calculatrice . Dans mon programme je dois gérer un nombre a virgule ( ex: 10.20) dans une textbox et ensuite fair
Erreur envoi mail [ par doctanks ]
Bonjour,Voila je tente d'envoyer un mail par l'intermédiaire d'un petit logiciel mais lors de l'envoi je reçois le message: "Une exception non gérée s
remplir un imagelist [ par adsana ]
salutce code m'a vrmt embetté je sais comment remplir l'imagelist en utilisant des images bitmap.[using System;using System.Drawing;using System.Colle
[C#] System.Information & mode console [ par scoubidou944 ]
using System.Windows.Forms;string szComputerName = System.Windows.Forms.ComputerName;Vala, ca marche nickel, le pb, c'est qu'en mode console, 'using S
System.Windows.Forms.MonthCalendar [ par Godzidane ]
Qlq'1 sait il comment récupérer, en C#, dans une WinForm, la date sélectionnée par un utilisateur dans le contrôle MonthCalendar ?Par avance merci.
transfere les donnés dune bases acces dans un fichier txt [ par kmbmaster ]
bonjour ,je suis debutant en c# jaimerais pouvoir transfere les donnés dune base (accesss) dans un fichier texte mais je n'y arrive pas ! est ce qun
Exception [ par xelr90 ]
Je débute en C# et j'ai des probleme...J'essaye de crée un petit morpion mais pour l'instant je n'ai que crée la fenetre winforms avec des checkBox ma
[GDI+] DrawLine et Zoom [ par ZogStriP ]
Je suis en train de faire un logiciel qui ressemble un peu à Paint (surtout pour l'édition au pixel prés et pour le zoom)Malheureusement je n'arrive p
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|