Une erreur générique s'est produite dans GDI+. [Résolu]

Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Dernière intervention
26 juillet 2007
- - Dernière réponse : Lucyberad
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Dernière intervention
26 juillet 2007
- 1 sept. 2006 à 21:40
Bonjour,

Je poste ce message car j'ai un petit problème

je souhaite inclure des images dans un fichier XML
j'ai donc découvert ce code:
    Public Function Base64ToImage(ByVal str As String) As System.Drawing.Image
        Dim ms As New System.IO.MemoryStream(Convert.FromBase64String(str))
        Dim image As System.Drawing.Bitmap = CType(System.Drawing.Bitmap.FromStream(ms), Bitmap)
        'image.MakeTransparent()
        ms.Close()
        Return image        ms Nothing : image Nothing
    End Function

    Public Function ImageToBase64(ByRef img As System.Drawing.Image) As String
        Dim ms As New System.IO.MemoryStream
        img.Save(ms, Imaging.ImageFormat.Jpeg)
        Return Convert.ToBase64String(ms.ToArray)
        ms.Close()
    End Function

Ce code fonctionne, il charge correctement mais au niveau de la sauvegarde il fait des sienne.
Quand on sauvegarde une image d'une picturebox, nikel il fonctionne correctement MAIS la ou ca va pas c'est quand l'image provient de la fonction Base64ToImage, celle qui charge.

L'erreur est sur:
img.Save(ms, Imaging.ImageFormat.Jpeg)
et résumé d'un simplicité extreme:
Une erreur générique s'est produite dans GDI+.

(si je me souvien bien, GDI+ est ce qui gere la classe System.Drawing dont .save)

j'ai fais l'essai tout simple: 4 bouton, 1 picturebox
le premier charge une image d'un fichier sur le disque dur et la met dans la picturebox
le 2eme charge l'image d'un string (une image sous forme de chaine de caractere en base 64)
le 3eme sauvegarde l'image de la picturebox sous forme de string
la 4eme sauvegarde l'image de la picturebox sous forme de fichier

1 + 3 => fonctionne
1 + 4 => fonctionne
2 + 3 => erreur
2 + 4 => erreur

sachant que le bouton 4 contient uniquement img.Save("c:\image.jpg") on ne peut plus faire img.save quand img provient de la fonction Base64ToImage (c'est ma conclusion)

la question est simple, (la reponse surement moins), Comment corriger ce bug ?

(perso je voit pas d'erreur, pour moi un objet image est le meme, on s'en fous de sa provenance)

Merci de m'aider !


L U C Y I3 E R @ D
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
3
Merci
Je vais certainement dire une grosse connerie (je ne maitrise pas du tout ce dont tu parle, j'ai même un peu de mal à suivre), mais d'un coté, dans ImageToBase64, tu convertie une image Jpeg en string Base64.

De l'autre, dans Base64ToImage, tu convertie une string Base64 en image semble-t-il au format Bitmap.

Pour moi, dans le cas ou tu utilise tes fonctions pour d'abords convertir une image Jpeg en chaine, puis pour reconvertir cette chaine en image, c'est une image au format Jpeg (l'image de départ) que tu devrais récupérer, je pense. Et si tu interprete cette image comme étant du Bitmap, je comprend qu'elle soit mal interpretée.

Ou alors tes méthodes de System.Drawing sont capable de détecter le format de l'image, et de la convertir au format demandé.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_casy
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
je trouve étrange ton transtypage :
CType(System.Drawing.Bitmap.FromStream(ms), Bitmap)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Dernière intervention
26 juillet 2007
0
Merci
ha ouais, c'est peut etre le fait de transorfmer un stream en objet direct...
je vais faire des essais la dessus


L U C Y I3 E R @ D
Commenter la réponse de Lucyberad
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Dernière intervention
26 juillet 2007
0
Merci
si on reflechi bien, il est inutile

voici donc le code refai:

    Public Function Base64ToImage(ByVal str As String) As System.Drawing.Image
        Dim ms As New System.IO.MemoryStream(Convert.FromBase64String(str))
        Dim image As System.Drawing.Bitmap = System.Drawing.Bitmap.FromStream(ms)
        'image.MakeTransparent()
        Return image        ms.Close() : ms Nothing : image Nothing
    End Function

(pour info: j'ai mis la transparence en commentaire, c au cas ou plus tard je voudrai l'ajouter...)

donc, voila le problème est toujours récurrent, et je ne voit pas ce qui pourrai ne pas marcher.


L U C Y I3 E R @ D
Commenter la réponse de Lucyberad
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Casy a pointé quelque chose de très interessant ^^

System.Drawing.Bitmap
devrait être :
System.Drawing.Image

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
Messages postés
420
Date d'inscription
mercredi 16 juin 2004
Dernière intervention
26 juillet 2007
0
Merci
Ha merci, ca fonctionnne nikel maintenant

franchement: sacré coup d'oeil Casy !

J'ai pensé a ca au depart:
    img.Save(ms, Imaging.ImageFormat.Bmp)
    img.Save(ms, Imaging.ImageFormat.Png)
ils sont tous pareil, le rawformat est l'interpretation d'un objet image et non d'un objet bitmap il converti l'image au ImageFormat choisi et ensutie le reste de la fonction le fait en string
avec l'objet bitmap (j'ai testé), meme un img.Save(ms, Imaging.ImageFormat.Bmp) ne fonctionne pas.

Encore merci !


L U C Y I3 E R @ D
Commenter la réponse de Lucyberad

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.