begin process at 2012 02 11 18:37:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Autre

 > 

OutOfMemoryException quand je fait Graphics.FromImage


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

OutOfMemoryException quand je fait Graphics.FromImage

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ée dans : windows, system, image, forms, btnload


Répondre à ce message

Sujets en rapport avec ce message

picturebox [ par johnnous ] bonjour j'ai un petit soucis j'ai une picturebox avec une image de font sur celle ci j'ajoute d'autre picturebox fille je dois pouvoir deplace et fair Aide propos d'une erreur [ par shedex ] pourriez vous me donner une solution à propos de cette erreur car je n'arrive pas à la résoudre merci d'avance : L'exception System.ArgumentOutOf Exécution d'un script SQL à partir d'un menu contextuel [ par inf2010 ] Bonjour heureuse de faire partie de votre communauté [^^happy3] Je suis débutante en C#/.NET je fais une application qui me permet d'exécuter un scri intercepter et annuler un shutdown sous seven [ par arnahel ] Bonjour, dans le cadre d'un projet, j'ai besoin d'intercepter et d'annuler une demande de shutdown d'un utilisateur sous seven. L'application sur laq Problem avec l'Activex Vivotek RTSPVaPg [ par gouranos ] Bonjour, j'ai crée une simple Widows Form sous C#, le but est de pouvoir lire le flux video d'une camera IP Pan/Tilt Vivotek 7135. L'Activex RTS Probleme C# BDD OutOfRange [ par KrqcS ] Bonjour à vous, j'essaye désesperemment de mettre le contenu de la colonne d'une table dans une combobox mais pas moyen. [code=cs]OleDbConnection Cal 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,558 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales