Probleme de fichier utilisé

Résolu
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 2 avril 2004 à 17:18
olixelle Messages postés 506 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 3 mars 2008 - 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());
    }
}

7 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 avril 2004 à 19:15
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 !!!!
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 avril 2004 à 18:11
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 !!!!
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
2 avril 2004 à 18:12
Un troisième fichier temporaire ????

::|The S@ib|::
MVP C#.NET
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 avril 2004 à 18:15
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 avril 2004 à 18:55
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());
}
}
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 avril 2004 à 19:40
Je vais tenter tout de suite et me débrouiller avec ca.
Je connaissais pas les MemoryStream !

Merci infiniment !!!

Mx
0
olixelle Messages postés 506 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 3 mars 2008 2
19 mai 2005 à 16:38
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
0
Rejoignez-nous