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

VB.NET Discussion :

Imagelist + listiview avec Image stockée en Bytes dans base MySQL


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut Imagelist + listiview avec Image stockée en Bytes dans base MySQL
    Bonjour à tous,

    Je stocke dans une base MYSQL des photos en Bytes (j'ai fait ce choix en connaissance de cause le nombre d'entrée étant limité, 300 lignes grand max)


    Quand j'essaye de charger les bytes de la photo dans un listview j'ai des erreurs (impossible conversion en string).

    L’objectif étant quand on sélectionne une ligne du listview les bytes sont convertis en image dans un picturebox.

    Pouvez-vous svp me dire qu'est ce qui cloche dans mon code (chargement données dans listview) ?

    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
     
     
     Dim CMD As New MySqlCommand("SELECT * FROM personnel", cnx)
                Using lecteur As MySqlDataReader = CMD.ExecuteReader()
     
                    While lecteur.Read()
     
                        Dim NUM_LIGNE As String = lecteur("NUM_lIGNE")
                        Dim CIVILITE As String = lecteur("CIVILITE")
     
                        Dim NOM As String = lecteur("NOM")
     
     
                        Dim BYTE_PHOTO As Byte() = lecteur("PHOTO")
     
     
                        Me.ListView1.Items.Add(New ListViewItem(New String() {NUM_LIGNE, CIVILITE,NOM, BYTE_PHOTO}))
     
                    End While
     
                End Using

    Merci pour votre aide,

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut
    Bonjour à tous,

    Je continue mes tests sans trop de succès.

    J'utilise les fonctions de conversion ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     Public Function Convert_En_Donnees(ByVal myImage As Image) As Byte()
            Dim ms As New MemoryStream()
            myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
            Dim myBytes(ms.Length - 1) As Byte
            ms.Position = 0
            ms.Read(myBytes, 0, ms.Length)
            Return myBytes
        End Function
     
        Public Function Convert_En_Image(ByVal data() As Byte) As Image
            Dim stream As New MemoryStream(data)
            Return Image.FromStream(stream)
        End Function

    Le stockage se passe bien mais j'essaye de récupérer l'image en bytes dans une listview de maniere temporaire impossible.

    Celà veut dire qu'il n'est pas possible de stoker des bytes() dans une listview ?

    Merci pour ceux qui pourront m'apporter de l'aide

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Hello tu as peut être une réponse ici c'est en c#, dans ton cas il faut utiliser image frombyte je pense
    https://www.developpez.net/forums/d9...ages-listview/

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir,

    Les éléments de la liste peuvent être affichés de plusieurs manières différentes. Ils peuvent apparaître sous forme de grandes icônes (LargeImageList), de petites icônes (SmallImageList) ou de petites icônes dans une liste verticale (StateImageList). Les éléments peuvent aussi contenir des sous éléments comportant des informations relatives à l'élément parent.
    C’est par l’affectation de la propriété View que se définit le mode d’affichage souhaité pour la ListView : Details, LargeImageList, SmallImageList et StateImageList.
    Exemple : MaListView.View = View.LargeIcon.

    J'ignore si cette info te permettra de résoudre ton problème mais c'est une piste à explorer ...


  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Hello tu as peut être une réponse ici c'est en c#, dans ton cas il faut utiliser image frombyte je pense
    https://www.developpez.net/forums/d9...ages-listview/
    Merci beaucoup Youtpout978, c'est effectivement la solution par contre quand je charge dans mon listview, l'indexofKey de l'imagelist impossible la récupérer dans un picturebox avec l'index utilisé.
    Le contrôle picturebox disparaît carrément au chargement.

    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
     
    'Au chargement du form avec procédure de connexion à la BDD
     
    ImageList1.Images.Add(NUM_PHOTO, (ConvertToImage(lecteur("PHOTO"))))
    ImageList1.Images.IndexOfKey(NUM_PHOTO)
     
    'Chargement de l'index dans le listview
     
    Me.ListView1.Items.Add(New ListViewItem(New String() {NUM_LIGNE, CIVILITE,PRENOM, ImageList1.Images.IndexOfKey(NUM_PHOTO)}))
     
    'Depuis événement  clique sur ligne du  listview
     
    Me.PictureBox1.Image = ImageList1.Images("4")    'j'ai aussi testé  ImageList1.Images.Item("4")  même résultat
     
    'j'ai mis le nombre  4 en dur juste pour tester, je remplacerai par une variable par la suite
    Citation Envoyé par Phil Rob Voir le message
    Bonsoir,
    C’est par l’affectation de la propriété View que se définit le mode d’affichage souhaité pour la ListView : Details, LargeImageList, SmallImageList et StateImageList.
    Exemple : MaListView.View = View.LargeIcon.
    J'ignore si cette info te permettra de résoudre ton problème mais c'est une piste à explorer ...

    Merci Phil Rob pour avoir pris le temps de répondre
    mais pour le moment, je ne cherche pas afficher la photo dans listview juste à stoker l'info récupérer dans la base Mysql (en bytes) puis l’afficher dans un picturebox en fonction de la ligne du listview selectionnée.

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    Kar2013
    mais pour le moment, je ne cherche pas afficher la photo dans listview juste à stoker l'info récupérer dans la base Mysql (en bytes) puis l’afficher dans un picturebox en fonction de la ligne du listview selectionnée.
    le code exemple qui suit récupère la photo ,et l'affiche dans le ListView et le PicBox car abondance de biens ne nuit pas :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Imports System.Data.SqlClient
    Imports System.IO
     
    Public Class Form3
        Private strCon As String = My.Settings.ChaineDeConnexion
        Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            ListView1.View = View.Details
            ListView1.FullRowSelect = True
            ListView1.GridLines = True
            ListView1.Columns.Add("Column0", -2, HorizontalAlignment.Left)
            ListView1.Columns.Add("Column1", -2, HorizontalAlignment.Left)
            ListView1.Columns.Add("Column2", -2, HorizontalAlignment.Left)
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ImageList1.Images.Clear()
            Using conn As New SqlConnection(strCon)
     
                conn.Open()
                Using cmd As New SqlCommand("SELECT NUM_LIGNE,NOM ,PHOTO  FROM ALBUM", conn)
     
                    Using rd As SqlDataReader = cmd.ExecuteReader()
                        Dim ndxImage As Integer = 0
                        While rd.Read()
     
                            Dim Num_Ligne As String = rd("NUM_lIGNE").ToString()
                            Dim Nom As String = rd("NOM").ToString()
                            Dim Photo_Bytes() As Byte = New Byte(0) {}
                            Photo_Bytes = CType(rd("PHOTO"), Byte())
                            Dim pic As Image
                            Using ms As New MemoryStream(Photo_Bytes)
                                pic = Image.FromStream(ms)
                            End Using
                            ImageList1.Images.Add(pic)
     
                            Dim lvitem As New ListViewItem()
                            lvitem.ImageIndex = ndxImage 
                            lvitem.SubItems.Add(rd("NUM_LIGNE").ToString)
                            lvitem.SubItems.Add(rd("NOM"))
                            Me.ListView1.Items.Add(lvitem)
                            ndxImage += 1
                        End While
     
                    End Using ' close reader
                End Using ' close cmd
            End Using ' close conn
     
     
            ListView1.SmallImageList = ImageList1
     
        End Sub
     
        Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged
            If (ListView1.SelectedItems.Count > 0) Then
                Dim lvitem As ListViewItem = ListView1.SelectedItems(0)
     
                PictureBox1.Image = ImageList1.Images(lvitem.Index)
            End If
     
     
        End Sub
    End Class
    Comment cette ligne si tu ne veux pas voir la photo dans ListView:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    '  lvitem.ImageIndex = ndxImage
    bon code...

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut
    Bonjour à tous,

    MABROUKI merci beaucoup pour ton intervention cela fonctionne par contre la photo remonte très floue.



    Nom : test_appli.png
Affichages : 504
Taille : 48,0 Ko

    Une idée sur le problème ?

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    essaye ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                            'Dim pic As Image
                            'Using ms As New MemoryStream(Photo_Bytes)
                            '    pic = Image.FromStream(ms)
                            'End Using
                            'ImageList1.Images.Add(pic)
     
                            Dim bit As Bitmap
                            Using ms As New MemoryStream(Photo_Bytes)
                                bit = New Bitmap(ms)
                            End Using
                            ImageList1.Images.Add(bit)

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut
    Merci MABROUKI, je viens de tester malheureusement c'est toujours pareil.

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 62
    Points : 19
    Points
    19
    Par défaut
    Bonjour à tous,

    Il semblerait que imagelist compresse les images de façon irréversible


    J'ai pensé à effectuer un SELECT dans la base de l’utilisateur sélectionné en différé du chargement du listview.

    Mais là, il faut parcourir toute la base MySQL avec un WHILE et alourdir considérablement le temps de réponse

    Ou est ce que je me trompe ?

    Merci,

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    n'utilise pas l'image qui est dans ta listview mais celle précédemment récupérer, quand tu fais ta lecture en bdd tu stock tes données dans un objet , et tu boss avec cette liste d'objet plutôt qu'affecter directement à ta list view tes données, c'est pour ça que la poo est faite après tout.

  12. #12
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Kar2013 Voir le message
    Bonjour à tous,

    Il semblerait que imagelist compresse les images de façon irréversible


    J'ai pensé à effectuer un SELECT dans la base de l’utilisateur sélectionné en différé du chargement du listview.

    Mais là, il faut parcourir toute la base MySQL avec un WHILE et alourdir considérablement le temps de réponse

    Ou est ce que je me trompe ?

    Merci,
    Euh non,il resize la taille image:cela a pour effet dans GDI+ de changez la résolution.
    Pour contourne ce problème,il faut affecter une taille d'image(max=256 pour un ImageList) à ImageList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    ImageList1.ImageSize = New Size(256, 256)

    code déjà donné revu :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    Imports System.Data.SqlClient
    Imports System.IO
     
    Public Class Form3
        Private strCon As String = My.Settings.BDPHOTOSConnectionString
        Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            ListView1.View = View.Details
            ListView1.FullRowSelect = True
            ListView1.GridLines = True
            ListView1.Columns.Add("Column0", -2, HorizontalAlignment.Left)
            ListView1.Columns.Add("Column1", -2, HorizontalAlignment.Left)
            ListView1.Columns.Add("Column2", -2, HorizontalAlignment.Left)
     
            '----------AJOUTER ----------
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ImageList1.Images.Clear()
     
            '----------AJOUTER ----------
            ImageList1.ImageSize = New Size(256, 256)
            Using conn As New SqlConnection(strCon)
     
                conn.Open()
                Using cmd As New SqlCommand("SELECT NUM_LIGNE,NOM ,PHOTO  FROM ALBUM", conn)
     
                    Using rd As SqlDataReader = cmd.ExecuteReader()
                        Dim ndxImage As Integer = 0
                        While rd.Read()
     
                            Dim Num_Ligne As String = rd("NUM_lIGNE").ToString()
                            Dim Nom As String = rd("NOM").ToString()
                            Dim Photo_Bytes() As Byte = New Byte(0) {}
                            Photo_Bytes = CType(rd("PHOTO"), Byte())
                            Dim pic As Image
                            Using ms As New MemoryStream(Photo_Bytes)
                                pic = Image.FromStream(ms)
                            End Using
                            ImageList1.Images.Add(pic)
     
     
                            Dim lvitem As New ListViewItem()
                            lvitem.ImageIndex = ndxImage ' commente cette ligne si tu ne veux pas voir la photo dans ListView
                            lvitem.SubItems.Add(rd("NUM_LIGNE").ToString)
                            lvitem.SubItems.Add(rd("NOM"))
                            Me.ListView1.Items.Add(lvitem)
                            ndxImage += 1
                        End While
     
                    End Using ' close reader
                End Using ' close cmd
            End Using ' close conn
     
            ListView1.SmallImageList = ImageList1
     
        End Sub
     
        Private Sub ListView1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListView1.SelectedIndexChanged
            If (ListView1.SelectedItems.Count > 0) Then
                Dim lvitem As ListViewItem = ListView1.SelectedItems(0)
                PictureBox1.Image = ImageList1.Images(lvitem.Index)
            End If
     
     
        End Sub
    End Class
    bon code....

Discussions similaires

  1. Chargement d'un fichier Excel afin de l'intégrer dans une base MySQL
    Par JuniorBI dans le forum Développement de jobs
    Réponses: 9
    Dernier message: 15/07/2017, 00h32
  2. Réponses: 1
    Dernier message: 29/06/2015, 14h41
  3. [VB6]ecrire une chaine de byte dans la base de registre
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 17/12/2008, 10h50
  4. [BDD] Erreur dans la connexion à une base MySQL
    Par dodo10 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2005, 19h52
  5. Réponses: 3
    Dernier message: 12/11/2003, 00h34

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