Save d'une copie d'image : erreur générique GDI+

Signaler
Messages postés
3
Date d'inscription
vendredi 11 septembre 2009
Statut
Membre
Dernière intervention
23 juin 2010
-
Messages postés
3
Date d'inscription
vendredi 11 septembre 2009
Statut
Membre
Dernière intervention
23 juin 2010
-
Bonjour,

Je rencontre actuellement une erreur d'exécution dont je n'arrive pas à trouver la cause.

Petit résumé :

J'ai écrit un bout de code permettant de redimensionner une image en la passant à 200 dpi.
Lors de l'exécution du programme, j'ai l'erreur "Une erreur générique s'est produite dans GDI+", lors de l'instruction "save".

Comme conseillé sur de nombreux forums, je fais un save sur une copie de l'image source et l'image source est auparavant fermée afin d'éviter tout conflit. Cependant l'erreur est toujours là.

Algorithme général :
- Ouverture de l'image source
- Copie de l'image source dans une image redimensionnée
- Fermeture de l'image source
- Sauvegarde de la copie => ERREUR


Voici le code :

String inFilePath = @"D:\inFile.tif";

String outFilePath = @"D:\outFile.tif";

// Ouverture de l'image à redimensionner
FileInfo inFile = new FileInfo(inFilePath);

// Stockage de l'image dans un flux
byte[] readByteInFile = new byte[inFile.Length];
(inFile.OpenRead()).Read(readByteInFile, 0, Convert.ToInt32(inFile.Length));
Stream tmpStream = new MemoryStream(readByteInFile, 0, eadByteInFile.Length);			

Image img = Bitmap.FromStream(tmpStream);

//*** Redimensionnement de l'image
Bitmap bitmap;
int w, h;
int destinationDpi = 200;
w = Int32.Parse((img.Width * (destinationDpi / Convert.ToInt32(img.HorizontalResolution))).ToString());
w =Convert.ToInt32 (img.Width * (destinationDpi / img.HorizontalResolution ));
h = Convert.ToInt32 (img.Height * (destinationDpi / img.VerticalResolution ));

bitmap = new Bitmap(w,h);
bitmap.SetResolution(destinationDpi,destinationDpi);
Graphics g = Graphics.FromImage((Image)bitmap);
g.DrawImage(img, 0, 0, w, h);

img.Dispose();
img = null;

//*** Fin redimensionnement de l'image

// Définition du format de l'image en TIFF
ImageCodecInfo tiffCodecInfo = GetEncoderInfo("image/tiff");

EncoderParameters myEncoderParameters = new EncoderParameters(2);	

// Compression de l'image en CCITT group4 
myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);				

// Encodage de l'image en bitonal
myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 1L);

// sauvegarde de l'image			
bitmap.Save(outFilePath, tiffCodecInfo, myEncoderParameters);	// <= L'ERREUR ARRIVE ICI		

tmpStream.Close();
g.Dispose();
bitmap.Dispose();


Informations supplémentaires :

1) L'erreur est déclenchée lors de l'appel de
bitmap.Save(outFilePath, ImageFormat.Tiff);


2) Si je remplace :
bitmap.Save(outFilePath, tiffCodecInfo, myEncoderParameters);

par :
bitmap.Save(outFilePath, ImageFormat.Tiff)
, je n'ai pas d'erreur.

3) Si je mets en commentaire le bloc "Redimensionnement de l'image", et que je fais un save directement sur ma variable img :
img.Save(outFilePath, tiffCodecInfo, myEncoderParameters);
, je n'ai pas d'erreur.


J'ai parcouru de nombreux forums traitant de cette erreur, malheureusement aucune solution proposée ne convenait.


Un grand merci par avance à ceux et celles qui pourront m'aider !

4 réponses

Messages postés
195
Date d'inscription
dimanche 10 février 2002
Statut
Membre
Dernière intervention
16 février 2016

Je n'ai pas pas le temps de lire profondément ton code toute de suite.
Mais si utilisé plutôt la méthode getthumb, plutôt que de modifié la résolution de ton image.

Ce n'est qu'une simple suggetion.

En espérant te donner une "bonne" piste

RodCobalt22, vous salue bien
Pensez au TAG résolu ! Ainsi les réponses seront plus facile à trouver et les serial Helper iront plus vite
 PS : Pardonnez mes fautes d'orthographe (All
Messages postés
3
Date d'inscription
vendredi 11 septembre 2009
Statut
Membre
Dernière intervention
23 juin 2010

Merci pour ta réponse.
En fait quand je parle de redimensionnement, c'est en terme de pixel, pas de taille. Je passe mon image de 300 à 200 dpi, tout en conservant la hauteur et la largeur d'origine.
Donc la fonction GetThumbnailImage ne conviendra pas ici.
Messages postés
12
Date d'inscription
dimanche 24 février 2008
Statut
Membre
Dernière intervention
20 juin 2010
1
Bonjour voilà un code que j'ai trouver sur ce lien:
http://forum.hardware.fr/hfr/Programmation/CNET-managed/redimmensionner-image-sujet_101755_1.htm


Je crois qu'il correspond à ce que tu cherches
private static Image ScaleByPercent(Image imgPhoto, int Percent)
        {
            float nPercent = ((float)Percent / 100);

            int sourceWidth = imgPhoto.Width;
            int sourceHeight = imgPhoto.Height;
            int sourceX = 0;
            int sourceY = 0;

            int destX = 0;
            int destY = 0;
            int destWidth = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap bmPhoto = new Bitmap(destWidth, destHeight,
                                     PixelFormat.Format24bppRgb);
            bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
                                    imgPhoto.VerticalResolution);

            Graphics grPhoto = Graphics.FromImage(bmPhoto);
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBilinear;

            grPhoto.DrawImage(imgPhoto,
                new Rectangle(destX, destY, destWidth, destHeight),
                new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
                GraphicsUnit.Pixel);

           grPhoto.Dispose();
            return bmPhoto;
        }



Fait-moi savoir si ce n'est pas ce que tu cherches, je bosserai dessus
Pierre-Luc
Messages postés
3
Date d'inscription
vendredi 11 septembre 2009
Statut
Membre
Dernière intervention
23 juin 2010

Désolé pour la réponse un peu tardive.

J'ai testé le code que tu m'a envoyé, et j'ai le même souci : lors du save effectué sur l'image retournée par la fonction, j'ai l'erreur "Une erreur générique s'est produite dans GDI+".

Il semble que cette erreur arrive dès que j'utilise un bitmap pour modifier mon image d'origine, et que je l'encode en CCITT 4 lors du save.

J'utilise peut-être mal la fonction d'encodage, je vais chercher dans cette direction.

En tout cas merci pour ton aide.