Meilleur auteur de réponses
Image format : erreur GDI

Question
-
Bonjour,
J'ai l'erreur : "Une erreur générique s'est produite dans GDI+."
Code : ErrorCode = -2147467259
C'est la méthode "Save" ci-dessous, qui la déclenche. Ceci ne se produit que sur certaines images , pas sur toute (trop simple). Si, pour les images qui plantent, je spécifie le format Imaging.ImageFormat.PNG, la méthode save ne plante pas...
Dim imgDetail As Byte() = Nothing Dim img As Image Dim ms As System.IO.MemoryStream imgDetail = dtPht("imgThumbList") ms = New System.IO.MemoryStream(imgDetail) img = Image.FromStream(ms) img.Save(strCheminVignetteList.Trim & "\" & dtPht("NomFichier").ToString.Trim & GetExtImg(dtPht("TypeImg"))) img.Dispose() ms.Close() ms.Dispose()
Y a t'il un moyen de détecter le format de l'image?
FB
- Modifié FrançoisBOSSANT jeudi 3 mai 2012 08:22
Réponses
-
J'ai trouvé ceci :http://msdn.microsoft.com/en-us/library/bb882579(v=vs.90).aspxCela pourrait expliquer, pour wmf, emf et icon, que l'image soit bienlue mais ne puisse être enregistrée.Auquel cas, on en revient au forçage du format lors de l'enregistrement.Difficile d'en dire plus sans savoir exactement ce qui a été mis en base !
Fred- Marqué comme réponse FrançoisBOSSANT mercredi 9 mai 2012 14:35
Toutes les réponses
-
-
Bonjour,
Il semble que cette erreur peut avoir des causes multiples : l’objet MemoryStream utilisé est fermé ou n’est pas ouvert avant l’enregistrement. Une autre cause peut être, par exemple, le dossier où l’image est enregistrée. Est-ce qu’on peut voir aussi le code de la fonction dtPht ?
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
Bonjour,
Je vais préciser l'aval de ce code :
imgDetail = dtPht("imgThumbList")
dtPht est un datatable. L'image est stockée dans SQL Server.
L'erreur est générée par ce que le format de l'image n'est pas du JPEG mais du PNG. A la base, on avait bien défini avec mon client que seulement ce format serait utiliser.
Mon problème est de savoir comment comment connaitre le type de l'image avant la méthode save.
imgDetail = dtPht("imgDetail") ms = New System.IO.MemoryStream(imgDetail) img = Image.FromStream(ms) Try img.Save(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & GetExtImg(dtPht("TypeImg")), img.RawFormat) Catch ex As Exception File.Delete(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & GetExtImg(dtPht("TypeImg"))) img.Save(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & ".png", Imaging.ImageFormat.Png) End Try img.Dispose() ms.Close() ms.Dispose()
Ce bout de code fonctionne. Mais j'aimerai éviter cette astuce et détecter le format de l'image.
Je pensais utiliser img.RawFormat, mais je n'ai pas réussi à l'utiliser...
FB
-
Bonjour,
Si dtPht est un DataTable il faut tout d’abord accéder à la ligne de votre DataTable qui contient l’image et puis obtenir l’image. Voilà un exemple : http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5ae0b89f-403a-4e3a-8ce7-55ba51979337.
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
- Marqué comme réponse Ciprian Duduiala mercredi 9 mai 2012 07:55
- Non marqué comme réponse FrançoisBOSSANT mercredi 9 mai 2012 07:57
-
Non, mais je crois que vous n'avez pas compris. Votre exemple traite la gestion d'un objet PictureBox...Ce qui ne m'intéresse pas.
Le but est d'EXTRAIRE l'image du DataTable dans un fichier dans le format approprié.
Mon bout de code fonctionne pour un format JPEG mais pas pour un format PNG.
Comment connaitre le format d'un objet image dans le cas exposé ci-dessus?
De cette manière, je pourrais surcharger la méthode Save en spécifiant le bon format.
Sachant que l'utilisation de img.RawFormat comme ci-dessous ne fonctionne pas (et je ne comprends pas pourquoi).
img.Save(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & ".png", img.RawFormat)
FB
-
Bonjour,
Image.FromStream retourne un objet du type Image utilisé dans l’exemple pour définir la propriété PictureBox.Image. Il faut seulement adapter ce code pour votre situation et utiliser Image.FromStream pour définir la valeur de votre objet img.
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
-
-
Bonjour,
Image.FromStream retourne un objet du type Image utilisé dans l’exemple pour définir la propriété PictureBox.Image. Il faut seulement adapter ce code pour votre situation et utiliser Image.FromStream pour définir la valeur de votre objet img.
Bonne journée,
Cipri
Ciprian DUDUIALA, MSFT
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
je ne suis toujours pas d'accord... Votre lien n'a RIEN à voir avec mon besoin.
Pouvez vous me montrer un exemple de code adapté
FB
-
Je vais détailler un peu plus mon flux de données.
Mes données sont toutes stockées dans une base SQL Server (images inclues).
2 modes d'alimentation :
=> En masse
=> Via un Intranet
Les image sont placées dans des champs de type image dans la base SQL Server. Cet outil fonctionne TRES bien depuis plusieurs années.
Il avait été défini que les images soient toujours des JPG.
Via l'intranet, l'utilisateur a parfois oublié nos règles (et je n'ai rien fait pour l'empécher) et il a placé des PNG. Tout marche à prime abord.
Sauf lors de l'export en masse (voir bout de code ci-dessus) ou le code plante pour ces quelques images au format PNG.
FB
-
Curieux, cela signifie que ce Guid n'est pas reconnu.Pour info voici la liste des Guid que j'ai extraite dans mon framework 3.5
Shared Sub New()
ImageFormat.memoryBMP = New ImageFormat(New Guid("{b96b3caa-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.bmp = New ImageFormat(New Guid("{b96b3cab-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.emf = New ImageFormat(New Guid("{b96b3cac-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.wmf = New ImageFormat(New Guid("{b96b3cad-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.jpeg = New ImageFormat(New Guid("{b96b3cae-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.png = New ImageFormat(New Guid("{b96b3caf-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.gif = New ImageFormat(New Guid("{b96b3cb0-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.tiff = New ImageFormat(New Guid("{b96b3cb1-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.exif = New ImageFormat(New Guid("{b96b3cb2-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.photoCD = New ImageFormat(New Guid("{b96b3cb3-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.flashPIX = New ImageFormat(New Guid("{b96b3cb4-0728-11d3-9d7b-0000f81ef32e}"))
ImageFormat.icon = New ImageFormat(New Guid("{b96b3cb5-0728-11d3-9d7b-0000f81ef32e}"))
End SubCeci étant, même non reconnu, cela doit pouvoir permettre de traiter le
cas des fichiers non jpg ?
Fred- Modifié Foleide. _ mercredi 9 mai 2012 08:30
-
Lorsque les images sont des jpg, la méthode save fonctionne normalement ainsi :
Dim img As Image img = Image.FromStream(ms) img.Save(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & GetExtImg(dtPht("TypeImg")))
Lorsque j'ai eu des plantages lors de l'export, j'ai réussi à identifier l'image en cause et en testant, j'ai remarque que si j'ajoute le format PNG à la méthode save, l'erreur ne se déclenche plus.
img.Save(strCheminTypDoc.Trim & "\" & dtPht("NomFichier").ToString.Trim & ".png", Imaging.ImageFormat.Png)
Image PNJ qui plante à l'export
FB
- Modifié FrançoisBOSSANT mercredi 9 mai 2012 08:50
-
Normalement, si le RawFormat ne correspond à rien de connu, la méthodesave utilise automatiquement le format png.C'est ce que j'ai pu voir en décompilant avec Reflector.Essayez d'utiliser la surchargepublic void Save(string filename,ImageFormat format)En précisant jpeg comme format.De manière plus générale, si les utilisateurs peuvent uploader n'importequel type de fichier, il faudra peut-être encapsuler tout cela dans unegestion d'erreur.J'ai eu presque exactement le même problème en recevant des pdf à laplace d'images.
Fred -
J'ai trouvé ceci :http://msdn.microsoft.com/en-us/library/bb882579(v=vs.90).aspxCela pourrait expliquer, pour wmf, emf et icon, que l'image soit bienlue mais ne puisse être enregistrée.Auquel cas, on en revient au forçage du format lors de l'enregistrement.Difficile d'en dire plus sans savoir exactement ce qui a été mis en base !
Fred- Marqué comme réponse FrançoisBOSSANT mercredi 9 mai 2012 14:35
-