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

Signaler
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
-
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

6 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
je trouve étrange ton transtypage :
CType(System.Drawing.Bitmap.FromStream(ms), Bitmap)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
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
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
Casy a pointé quelque chose de très interessant ^^

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
2
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