VB 2008. Qui peut m'aider à trouver la bonne voie pour résoudre mon problème?

erick911 Messages postés 7 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 14 juillet 2010 - 12 juil. 2010 à 22:23
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 14 juil. 2010 à 00:52
Bonsoir,

Voici mon problème:

Je souhaiterais pouvoir imprimer dans un tableau les codes couleurs des pixels d'une image jpg ou bmp (le plus facile) de taille 24 x 36 pixels constituée d'un maximum de 16 couleurs.

A chaque couleur différente est attribué un n° de 1 à 16 et c'est ce chiffre qui devrait être imprimé dans le tableau.

Je pense résoudre ce problème avec VB 2008 que je découvre depuis quelques jours. J'ai quelques notions de programmation en VB6 mais c'est assez basique.

Voici comment je compte procéder:

1. Extraire les valeurs RVB de chaques pixels
2. Ecrire le code pour attribuer à chaque pixel une valeur (1 à 16) en fonction de sa couleur.
3. Ecrire ces valeurs dans un tableau excel.

Pourquoi passer par excel? Pour pouvoir ensuite dimensionner mon tableau et/ou mes cellules en fonction du format d'impression souhaité.....

Pensez-vous que cette approche du problème est acceptable?

Merci d'avance pour vos précieux conseils.

8 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
12 juil. 2010 à 22:41
Bonjour,

Tu peux créer une collection de couleurs et utiliser l'index de la couleur pour donner la valeur :

Private lCollection as New List(Of Color)

Ensuite, quand un Pixel arrive :

Public Function GetIdColor(Byval pColor as Color) as Integer
    If lCollection.Contains(pColor) Then
        Return lCollection.IndexOf(pColor)
    Else
        lCollection.Add(pColor)
        Return GetIdColor(pColor)
    End if
End Function


Ce n'est pas tolérant aux variations de couleurs (donc Bitmap seulement).

Pour le reste, je te laisse regarder dans l'aide.

Mon site
0
erick911 Messages postés 7 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 14 juillet 2010
13 juil. 2010 à 11:32
Bonjour Henri,
Merci pour tes conseils. N'oublies pas que je suis novice....
Tu veux dire donc que:

je dois utiliser une image.bmp et pas .jpg?
la couleur des pixels sera retournée dans la variable pColor?
Que chaque fois q'une couleur différente est analysée, elle sera ajoutée à la collection?
Que je pourrai placer la variable IndexOf dans mon tableau à 2 dimensions?

Pourrais-je aller jusqu'à utiliser une image bmp 256 couleurs?
Si cette image a pour path: c:\VB\test.bmp, comment vais-je pouvoir scanner ses pixels?

Serait-ce un bon début?


Public Class Form1

    Dim image1 As Bitmap

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click

        Try
            ' Retrieve the image.
            image1 = New Bitmap("C:\VB\test.bmp",True)

            Dim x, y As Integer

            ' Loop through the images pixels.

            For x = 0 To image1.Width - 1
                For y = 0 To image1.Height - 1

              ' que dois-je mette à cet endroit????

                Next
            Next
         end try
      end sub

0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
13 juil. 2010 à 13:39
Bonjour,

Puisque tu dis que tu es débutant, pense à vérifier Option Explicit et Option Strict sont bien à On.

GetIdColor te retournera un identifiant unique (de base 0, et l'ajoutera à sa liste si besoin) correspondant à la couleur passée en paramètre (récupérée par .GetPixel).
Seule limite pour la liste des couleurs, c'est la place en mémoire.

Ensuite, renseignes-toi sur le Net et dans l'aide intégrée sur les tableaux (de manière générale) pour en connaitre le fonctionnement.

Mon site
0
erick911 Messages postés 7 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 14 juillet 2010
13 juil. 2010 à 21:39
Bonsoir,

Désolé mais je suis déjà larguer. A vrai dire, je ne comprends déjà plus le sens de tes conseils.

Voici le début de mon projet:

Option Explicit On
Option Strict On

Public Class Form1

    Dim image1 As Bitmap

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Retrieve the image.
        image1 = New Bitmap("C:\test.bmp", True)

        Dim x, y As Integer

        ' Loop through the images pixels
        For x = 0 To image1.Width - 1
            For y = 0 To image1.Height - 1

            Next
        Next

        ' Set the PictureBox to display the image. Juste pour voir!
        PictureBox1.Image = image1
    End Sub
End Class


Que dois-je mettre dans la double boucle For x et For y ?

Je dois aussi créer mon futur tableau dans un fichier xls qui n'existe pas encore
Dans la case (1,1) de mon futur tableau, je dois mettre le code couleur du pixel (1,1)
Dans la case (1,2) , je dois mettre le code couleur du pixel (1,2) et ainsi de suite.....

Est-ce que le code couleur est pColor de ton exemple?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
13 juil. 2010 à 22:00
Bonjour,

Pour te connecter à un fichier Excel, regardes dans les sources du site, tu aura ta réponse.

Le code, simplement :
Valeur=GetIdColor(image1.GetPixel(x,y))

Valeur est la cible de l'assignation, ça peut être tout élément compatible avec un entier.

Mon site
0
erick911 Messages postés 7 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 14 juillet 2010
13 juil. 2010 à 22:50
Re bonsoir,

OK, merci. J'ai encore une erreur lors de la déclaration de lCollection

    Public Function GetIdColor(ByVal pColor As Color) As Integer
        Private/color lCollection As New List(Of Color)
        If lCollection.Contains(pColor) Then
            Return lCollection.IndexOf(pColor)
        Else
            lCollection.Add(pColor)
            Return GetIdColor(pColor)
        End If
    End Function


J'ai une erreur sur Private. Il est dit que Private n'est pas valable pour une déclaration de variable locale.... je ne comprends pas, désolé.

En ce qui concerne les fichiers Excel, je ferai une recherche mais pourrais-tu déjà m'indiquer si le fichier cible doit être créer avant de lancer le programme ou s'il se créera par le programme lui-même?

Je pense donc placer tous les codes couleur dans tableau(x,y) après avoir tapé Dim tableau(200,300)
Ensuite, transférer le tableau à 2 dimensions dans un fichier Excel dont le chemin sera C:\VB\resultats.xls

Est-ce la bonne approche?
0
erick911 Messages postés 7 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 14 juillet 2010
14 juil. 2010 à 00:22
Génial, tu m'as bien aidé et je t'en remercie 1000 fois. Première étape accomplie. Ca fonctionne!
Tous les codes couleurs semblent bien enregistrés dans le tableau (x,y).

Je voudrais me pencher maintenant sur la mise en page des résultats. Pourrais-je encore compter sur ton aide et tes conseils sans trop vouloir user de ton temps?

Voici mon code. As-tu des remarques à formuler?

Option Explicit On
Option Strict On

Public Class Form1

    Dim image1 As Bitmap
    Dim tableau(200, 300) As Integer
    Private lCollection As New List(Of Color)

    Public Function GetIdColor(ByVal pColor As Color) As Integer

        If lCollection.Contains(pColor) Then
            Return lCollection.IndexOf(pColor)
        Else
            lCollection.Add(pColor)
            Return GetIdColor(pColor)
        End If

    End Function

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' Retrieve the image.
        image1 = New Bitmap("C:\test.bmp", True)

        Dim x, y As Integer

        ' Loop through the images pixels
        For x = 0 To image1.Width - 1
            For y = 0 To image1.Height - 1
                tableau(x, y) = GetIdColor(image1.GetPixel(x, y))
                Console.Out.WriteLine(tableau(x, y))
            Next
        Next

        ' Set the PictureBox to display the image. Juste pour voir!
        PictureBox1.Image = image1
    End Sub

End Class
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
14 juil. 2010 à 00:52
Bonjour,

Concernant Excel, J'arrive un peu à coder des macros, mais commander Excel par VB.NET, je n'ai jamais fais.

Pour créer le fichier Excel, il faut le demander à Excel.

Mon site
0
Rejoignez-nous