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)

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

Administrateur CodeS-SourceS
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

Membre Club
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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,669 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.