Probleme de fichier utilisé [Résolu]

MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 avril 2004 à 17:18 - Dernière réponse : olixelle 520 Messages postés vendredi 30 juillet 2004Date d'inscription 3 mars 2008 Dernière intervention
- 19 mai 2005 à 16:38
Bonjour,

J'ai une appli qui me permet de loader un image dans une PictureBox.
Cette image est copiée ensuite dans un Bitmap.
Avec une trackBar, j'applique une compression a ce bitmap. (En fait, des que je relache la souris de la trackbar, le bitmap est sauvegardé avec le taux de compression de la valeur de la Trackbar).
Enfin, l'image sauvegardée est chargée dans une autre PictureBox (LivePicture).

Le but de cet appli est de voir en temps reel les modifications faites sur l'image de base.

Le probleme, c'est que ca marche la premiere fois que la methode ApplyChanges() est appelée (donc a la premiere compression). L'image est sauvegardée, puis reaffichée dans la PictureBox.
Mais des que je rechange le taux de compression ensuite, la j'ai une erreur me disant que le fichier "Test.jpg" (celui dans lequel j'enregiste l'image) est deja utilisée par un autre processus.
Le probleme se passe au niveau du fi.Delete();
Si je ne fais pas ce fi.Delete(), j'ai une erreur au niveau de la sauvegarde du fichier

Je comprend bien que cela puisse se passer ainsi, puisque c'est a partir de ce fichier "Test.jpg" que je load l'image de la 2eme PictureBox, et donc ce fichier est bien utilisé.
Mais pourtant, je release tous les objets et j'en recrée une instance a chaque fois, je pensais que ca eviterait ce probleme... Mais non.

J'ai essayé beaucoup de solutions, mais rien n'a marché.

Quelqu'un pourrait m'aider ?

Merci beaucoup !
Mx

private void InitializeBitmap()
{
  try
  {
    if(LiveBitmap != null)
    {
      LiveBitmap.Dispose();
      LiveBitmap = null;
    }
    LiveBitmap = new Bitmap(InitialPicture.Image, new Size(128, 128));
  }
  catch(Exception e)
  {
     MessageBox.Show(e.ToString());
  }
}

private void ApplyChanges()
{
  InitializeBitmap(); 
  try
  {
    Encoder enc = Encoder.Quality;
    EncoderParameter ep = new EncoderParameter(enc, (long)(Compression.Value));
    EncoderParameters eps = new EncoderParameters(1);
    eps.Param[0] = ep;
    ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
    FileInfo fi = new FileInfo(Application.StartupPath + @"\temp.jpg");
    if(fi.Exists) fi.Delete();
    fi = null;
    LiveBitmap.Save(Application.StartupPath + @"\temp.jpg", ici, eps);
    LiveBitmap.Dispose();
    LiveBitmap = null;
    fi = new FileInfo(Application.StartupPath + @"\temp.jpg");
    LivePicture.Image = null;
    LivePicture.Image = Image.FromFile(fi.FullName);
    fi = null;
    }
   catch(Exception e)
   {
      MessageBox.Show(e.ToString());
    }
}
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 avril 2004 à 19:15
3
Merci
bon, j'ai bricoler un bout de code vite fait (no erreur gérées ^^)

private void button_Compresser_Click(object sender, System.EventArgs e)
{
MemoryStream stream = new MemoryStream();
Image img = pictureBox_Brut.Image;

// ImageCodecInfo
// récup de celui qui nous interresse
ImageCodecInfo codec_info=null;
foreach ( ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
{
if ( info.MimeType == "image/jpeg")
{
codec_info = info;
break;
}
}

// EncoderParameters
EncoderParameters encoder_params = new EncoderParameters(1);
encoder_params.Param[0] = new EncoderParameter(Encoder.Quality, (long)numericUpDown.Value);

img.Save(stream, codec_info, encoder_params);

pictureBox_Compresse.Image = Image.FromStream(stream);
}



Cocoricoooooooo !!!!

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 avril 2004 à 18:11
0
Merci
deja ce que je comprend pas C pourquoi ton image temporaire (donc qui ne sera pas gardée si je comprend bien) tu l'enregistre sur le dur ?
pkoi ne pas la garder juste en mémoire ?
c'est plus sympa pour les perfs (et le dur)

Cocoricoooooooo !!!!
Commenter la réponse de cs_coq
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 2 avril 2004 à 18:12
0
Merci
Un troisième fichier temporaire ????

::|The S@ib|::
MVP C#.NET
Commenter la réponse de TheSaib
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 avril 2004 à 18:15
0
Merci
Coq ->
Beh parce que sinon les modifications (enfin, la compression) appliquée durant l'enregistrement ne sera pas prise en compte.
Si ?

TheSaib ->
Oui... Jvais plus m'en sortir moi :big)

Si jamais vous avez une autre solution je suis preneur !

Mais merci beaucoup !

Mx
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 avril 2004 à 18:55
0
Merci
J'ai donc essayé la méthode d'alterner 2 fichiers temporaires.
Avec le fi.Delete() -> Fichier utilisé par un autre processus.
Sans le fi.Delete() -> Une erreur au niveau du LiveBitmap.Save() -> "Une erreur générique s'est produite dans GDI+"

Grrrr, mais qu'est ce qui va pas dans ce code ?

bool f = false;
private void ApplyChanges()
{
    InitializeBitmap(); 
    try
   {
Encoder enc = Encoder.Quality;
EncoderParameter ep = new EncoderParameter(enc, (long)(Compression.Value));
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = ep;
ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
        string file = "Temp.jpg";
string fileToDelete = "";
if(f)
{
file = "Temp.jpg";
fileToDelete = "Temp2.jpg";
}
else 
{
file = "Temp2.jpg";
fileToDelete = "Temp.jpg";
}
f = !f;

LiveBitmap.Save(Application.StartupPath + @"" + file, ici, eps);
LiveBitmap.Dispose();
LiveBitmap = null;

FileInfo fi = new FileInfo(Application.StartupPath + @"" + file);
lbEstimedSize.Text = "Taille estimée : " + fi.Length / 1024 + " Ko";
LivePicture.Image = InitialPicture.Image;
LivePicture.Image = Image.FromFile(fi.FullName);
fi = null;

fi = new FileInfo(Application.StartupPath + @"" + fileToDelete);
if(fi.Exists) fi.Delete();
fi = null;
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 avril 2004 à 19:40
0
Merci
Je vais tenter tout de suite et me débrouiller avec ca.
Je connaissais pas les MemoryStream !

Merci infiniment !!!

Mx
Commenter la réponse de MorpionMx
olixelle 520 Messages postés vendredi 30 juillet 2004Date d'inscription 3 mars 2008 Dernière intervention - 19 mai 2005 à 16:38
0
Merci
Bonjour,

le pb vient de la fonction image.fromfile qui charge l'image dans un picturebox.
tant que tu ne fais pas monpicturebox.image.dispose, le fichier reste utilisé.
La méthode memorystream est une alternative mais reste du bricolage :(
j'ai pas de solution miracle, je cherche toujours :)

Rollerman
Commenter la réponse de olixelle

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.