IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Convertir Tableau Byte[] en image


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 51
    Points
    51
    Par défaut [VB.NET] Convertir Tableau Byte[] en image
    Bonjour,
    Tout d'abord pour expliquer le contexte: je cherche à enregistrer des images (peu importe le format) dans une base SQL Express 2005 et je veux ensuite récupérer l'image pour l'afficher sur ma Form. J'ai donc déclaré un champ de type "VarBinary(MAX)" dans ma table pour contenir l'image (Le champ de type "Image" est obsolète et va disparaitre dans SQL 2008, j'ai donc péféré prendre les devant).

    Dans mon code voici les fonctions que j'ai créé:

    Je convertis l'image en tableau de byte pour l'enregistrement en base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Shared Function ConvertImageToByteArray(ByVal imageToConvert As Image, ByVal formatOfImage As Imaging.ImageFormat) As Byte()
            Try
                Dim ms As New MemoryStream
     
                imageToConvert.Save(ms, formatOfImage)
     
                Return (ms.ToArray)
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Ensuite je formate ma chaine SQL pour l'enregistrement en base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Shared Function FormatModify(ByVal champ As Byte()) As String
            Dim ret As String
     
            If champ Is Nothing Then
                ret = "NULL"
            Else
                ret = String.Concat("CONVERT(varbinary(max),'", BitConverter.ToString(champ), "',1)")
            End If
     
            Return ret
        End Function
    L'enregistrement dans la table SQL semble se passer correctement, j'ai bien des données dans mon champ après la création de l'enregistrement.

    C'est la manipulation inverse qui pose problème.

    Je convertis la valeur de mon champ en tableau de Byte (C'est ici qu'il semble qu'il y ai un problème):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Public Shared Sub GetValue(ByVal field As Object, ByRef dbData As Byte())
            Dim conversion As Encoding = Encoding.Unicode
     
            If field.Equals(DBNull.Value) Then
                dbData = Nothing
            Else
     
                dbData = conversion.GetBytes(BitConverter.ToString(CType(field, Byte())))
                'dbData = CType(field, Byte())
            End If
        End Sub
    Je convertis le tableau de Byte récupéré en Image à l'aide d'un stream:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        Public Shared Function ConvertByteArrayToImage(ByVal tableau As Byte()) As Image
            Try
                Dim newImage As Image
                Dim ms As New MemoryStream(tableau)
     
                ms.Write(tableau, 0, tableau.Length)
     
                newImage = Image.FromStream(ms)
     
                Return newImage
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Et cette dernière fonction plante sur le "ms.Write" avec le message d'erreur: "Paramètre non valide".

    Est-ce que quelqu'un aurait une idée ou une autre méthode à ma poposer?

    Merci d'avance.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour insérer dans la base, il faut utiliser un sqlparameter (j'ai l'impression que tu concatène dans ta requete ...), de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd.commandtext = "INSERT INTO table (chVarBinary) VALUES (@img)"
    cmd.parameters.Add("@img",varbinary).value = TonTableauDeBytes
    sinon des fonctions qui marchent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Function ByteTabToImage(ByVal Bytes() As Byte) As System.Drawing.Image
        Return System.Drawing.Image.FromStream(New System.IO.MemoryStream(Bytes))
    End Function
     
     
    Public Function ImageToByteTab(ByVal image As System.Drawing.Image) As Byte()
        Dim m As New System.IO.MemoryStream
        image.Save(m, System.Drawing.Imaging.ImageFormat.Png)
        Return m.ToArray
    End Function
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    Merci pour ta réponse, j'ai essayé les bouts de codes que tu as posté mais j'ai toujours la même erreur.

    Donc tu as raison, je pense que le soucis viens de la manière dont j'enregistre mon champ Byte[] en base. En effet je concatène des "string" pour obtenir ma commande.

    Pour des raisons techniques (je dois utiliser des fonctions standards dans mon programme, j'utilise des DLL sur lesquelles je n'ai pas la main), je ne peux pas (Ou en tout cas je ne sais pas comment) utiliser ta méthode car je n'utilise pas directement un objet "SQLCommand".

    Voici la manière dont je génère ma requete "INSERT":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     sql = "Insert INTO Golf (Nom, IsAffichePub, ImageGolf) VALUES ({0}, {1}, {2})"
                sqlFormat = String.Format(sql, _
                BddFormat.FormatModify(Me._nom), _
                BddFormat.FormatModify(Me._isAffichePub), _
                BddFormat.FormatModify(Me._imageGolf))
     
                Using bdd As Bdd = New Bdd(BddFormat.DATABASE_BORNE)
                    res = bdd.WriteSQL(sqlFormat)
                End Using
    Et je n'ai pas la main sur l'objet "bdd.WriteSQL(sqlFormat)" (je ne peux pas le modifier).
    Comment enregistrer en base mon tableau de Bytes dans une string? En d'autres termes, quelle est la syntaxe si je voulais écrire la requete directement dans "SQL Server Manager Studio" par exemple?

    Merci

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il est possible d'enregistre un varbinary par requete string quand meme oui ...

    voici un code que j'avais pour obtenir le string à mettre pour enregistrer un tableau de byte (il faut passer par de l'hexa, et y a ptete des classes qui le font en une ligne dans le framework d'ailleurs ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim m As New System.IO.MemoryStream(TableauDeBytes)
    Dim valeurHexa As String = "0x"
    Dim hexvaleur As String
    For Each o As Byte In m.ToArray
        hexvaleur = Hex(o)
        While hexvaleur.Length < 2
            hexvaleur = "0" & hexvaleur
        End While
        valeurHexa &= hexvaleur
    Next
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 51
    Points
    51
    Par défaut
    Et bien après avoir échoué de la même manière en convertissant en Hexa avant de l'insérer dans ma requete, j'en suis revenu à ton premier conseil en faisant une belle verrue a mon programme principale mais bon au moins ca marche

    Voici pour résumer la solution qui fonctionne:

    Je convertis mon image en Byte[]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Shared Function ConvertImageToByteArray(ByVal imageToConvert As Image, ByVal formatOfImage As Imaging.ImageFormat) As Byte()
            Try
                Dim ms As New MemoryStream
     
                imageToConvert.Save(ms, formatOfImage)
     
                Return (ms.ToArray)
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Je formate ma requete SQL comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Public Shared Function FormatModify(ByVal champ As Byte()) As String
            Dim ret As String
     
            If champ Is Nothing Then
                ret = "NULL"
            Else
                ret = String.Concat("CONVERT(varbinary(max),@img,1)")
            End If
     
            Return ret
        End Function
    J'execute ma requete SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     Public Function WriteSQL(ByVal reqSql As String, Optional ByVal Param As Byte() = Nothing) As Integer
            Dim count As Integer
            Try
     
                Dim sqlCmd As SqlCommand
     
                'On construit une commande
                sqlCmd = New SqlCommand(reqSql, Me._sqlConnect)
                If Not Param Is Nothing Then
                    sqlCmd.Parameters.Add("@img", SqlDbType.VarBinary).Value = Param
                End If
     
                count = sqlCmd.ExecuteNonQuery
     
                Return count
            Catch ex As Exception
                Log.WriteLog(Log.eTypeLog.DbCommon, ex)
                Throw New Exception(String.Concat("Error while executing sql command : ", reqSql))
            End Try
     
        End Function
    Et ensuite dans l'autre sens pour récuperer mes donnée:

    Je récupère mon champ en base et je le CAST en Byte[]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Public Shared Sub GetValue(ByVal field As Object, ByRef dbData As Byte())
            If field.Equals(DBNull.Value) Then
                dbData = Nothing
            Else
                dbData = CType(field, Byte())
            End If
        End Sub
    Je transforme le tableau en Image:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Public Shared Function ConvertByteArrayToImage(ByVal tableau As Byte()) As Image
            Try
                Return Image.FromStream(New MemoryStream(tableau))
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Et ca marche!!!

    Merci pour ton aide sperot51

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 8
    Points
    8
    Par défaut conversion un tableau de byte en image dans compact framework
    Salut

    Comment je peux trnsformer un tableau de byte à une image dans compact framework, sachant que j'applique mon logiciel un un pda pocket pc 2003.

    J'ai utilisé les instructions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.IO.MemoryStream ms = new System.IO.MemoryStream(montableau);
        Image hh = new Bitmap(ms);                      
        pictureBox2.Image = hh;
    mais une exception est généré lors de l'exécution de l'instruction : Image hh = new Bitmap(ms) , qui dis," la valeur n'est pas comprise dans la plage attendue".
    pourtant, les valeurs de mon tableau est comprise entre 0 et 255.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un byte[] en image
    Par b_imen dans le forum Java ME
    Réponses: 10
    Dernier message: 31/10/2011, 17h10
  2. convertir tableau double en image jpg
    Par picsou42 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 09/06/2008, 09h26
  3. [vb.net 1.1] Mettre une image de fond dans un tableau
    Par malhivertman1 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/11/2006, 16h32
  4. [C#] Convertir un tableau de byte en Image
    Par goulhasch dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/01/2005, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo