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

cs_SpongeBobSquarePants Messages postés 3 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 23 juin 2010 - 17 juin 2010 à 16:21
cs_SpongeBobSquarePants Messages postés 3 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 23 juin 2010 - 23 juin 2010 à 09:34
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

cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
18 juin 2010 à 08:03
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
0
cs_SpongeBobSquarePants Messages postés 3 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 23 juin 2010
18 juin 2010 à 10:17
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.
0
B0ur5e Messages postés 12 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 20 juin 2010 1
19 juin 2010 à 15:20
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
0
cs_SpongeBobSquarePants Messages postés 3 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 23 juin 2010
23 juin 2010 à 09:34
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.
0
Rejoignez-nous