Générer une image à partir d'une matrice de valeur [Résolu]

Signaler
Messages postés
7
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
8 janvier 2009
-
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
-
Bonjour,
J'ai calculé l'intensité lumineuse en plusieurs point d'une surface. Je voudrais générer une image à partir de mes résultats:
-une matrice rectangulaire contenant la valeur de l'intensité en différents points de la surface et à intervalles réguliers.
J'aimerais que l'image soit en couleurs qui varient en fonction de l'intensité (par exemple faibles valeurs en bleu et fortes valeurs en rouge). J'obtiens à peu près ce que je veux en utilisant un graphique excel surface mais j'aimerais faire quelque chose de plus propre directement intégré à vb.
Je sais pas si c'est très clair...

4 réponses

Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
5
Salut,
Suffit de créer une bitmap de la taille de ta matrice puis de colorier chaque pixel en fonction de la valeur. Pour cela il est possible d'utiliser la méthode SetPixel de Bitmap mais c'est plutôt lent, pour plus de performance utilise la fonction LockBits de Bitmap.
Matrice = Tableau?

Private Sub txtTexts_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim matrice(499, 299) As Integer
    Dim bitmap As New Bitmap(500, 300)

    For i As Integer = 0 To matrice.GetLength(0) - 1
        For j As Integer = 0 To matrice.GetLength(1) - 1
            bitmap.SetPixel(i, j, GetMatriceColor(matrice(i, j)))
        Next
    Next
End Sub

Private Function GetMatriceColor(ByVal Value As Integer) As Color
    Return Color.FromArgb(255, Value, 0, 255 - Value)
End Function
Si ta matrice contient des valeurs entre 0 et 255, le 255 rouge et le 0 bleu. Bien sur c'est a toi de faire la conversion valeur => couleur en fonction de tes besoins.
Pour plus de perf, voir LockBits eu lieu de SetPixel: http://msdn.microsoft.com/fr-fr/library/5ey6h79d.aspx
Messages postés
7
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
8 janvier 2009

Merci!
Je vais regarder tout ça.
Messages postés
7
Date d'inscription
lundi 24 novembre 2008
Statut
Membre
Dernière intervention
8 janvier 2009

Merci ça marche très bien, j'ai un peu modifié tout ça, si ça intéresse quelqu'un:

La fonction fAffichageSol affiche l'intensité dans valeurs du Sol qui sont stockées dans le tableau ValeurLux entre les index 1 et Nx*Ny
La fonction fCouleur renvoie une valeur de couleur pour une valeur de lux en utilisant toute la plage du bleu au rouge. min et max sont les valeur maximale et minimale que peut prendre lux

Function fCouleur(ByVal min As Single, ByVal max As Single, ByVal lux As Single) As Color
        lux = CInt((lux - min) * (255 / (max - min)))
        If lux > 255 Or lux < 0 Then
            lux = 0
        End If
        Return Color.FromArgb(255, lux, 0, 255 - lux)
    End Function

    Sub fAffichageSol(ByVal ValeurLux() As Single)
        Dim Sol As New Bitmap(Nx + 1, Ny + 1)
        Dim i, j, k As Integer
        Dim Graphique As New FormGraphique
        k = 0
        For i = 1 To Nx
            For j = 1 To Ny
                k = k + 1
                Sol.SetPixel(i, j, fCouleur(fMinTab(ValeurLux, 1, Nx * Ny), fMaxTab(ValeurLux, 1, Nx * Ny), ValeurLux(k)))

            Next j
        Next i
        Graphique.PictureBoxSol.Image = Sol
        Graphique.ShowDialog()
      
    End Sub

Maintenant je cherche à aficher une image plus grande car je calcul des valeur d'intensité sur une grille 10x15 donc l'image est petite. Je posterai mes résultats si quelqu'un est interressé.
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
5
For i = 1 To Nx
            For j = 1 To Ny
                k = k + 1
                Sol.SetPixel(i, j, ...

Le 1er pixel d'une image est à l'index 0 et non 1. Même chose pour un tableau ou tout autre liste indexé.

Ce qui fait aussi que ceci est sans doute faux:

Dim Sol As New Bitmap(Nx + 1, Ny + 1)

Si Nx et Ny = 100, ton image vaudra 101*101 pixels... volontaire?

Pour le reste, je ne comprend pas assez bien pour commenter...