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 6 et antérieur Discussion :

traitement d image


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut traitement d image
    Bonsoir,

    je viens vous poser une petite question.
    Je veux faire un traitement d'image. Je passe mon image depuis une picture1, dans une matrice, puis, après modification (passage en niveau de gris) , je veux vérifier le travail en réimportant la matrice dans une image.
    Mais j'ai pas mal de soucis.
    Cela me renvoie l'erreur '9' dépassement de la plage, lors de l'attribution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matrice2(i, j).Blue = Gris(Matrice(i, j))


    Voyez une solution à ce problème?
    Je sent bien qu'il y a une problème au niveau de ma matrice 2... faut t'il faire un redim? pour la mettre à la même taille que la matrice 1.
    Ensuite, est ce que mettre la fonction "Gris" comme byte est acceptable?

    Je bosse sous VB6
    Merci d'avance

    Voici mon code

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    Option Explicit
    Option Base 1
    Private Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End Type
    Private Type Pixel
        Red As Byte
        Green As Byte
        Blue As Byte
    End Type
    Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Dim Matrice() As Pixel
    Dim Matrice2() As Pixel
    Dim Rvb As Long
    Dim NHeight, MWidth As Integer
    'renvoi le niveau de gris du Rvb
    Private Function Gris(bloc As Pixel) As Long
      Dim Moyenne As Long
      Moyenne = (bloc.Red + (bloc.Green / 256) + (bloc.Blue / 65536)) / 3
      Gris = Moyenne
    End Function
    '***************************************************************************
    'Procedure qui copie une image PictureBox vers une matrice de pixels
    Private Sub MatrixFromImage(Picture As PictureBox, Matrice() As Pixel)
     
        Dim PicBits() As Byte, PicInfo As BITMAP
        Dim Size As Long
        Dim i, j As Integer
        Dim Z As Long
     
        GetObject Picture.Image, Len(PicInfo), PicInfo
     
        Size = PicInfo.bmWidth * PicInfo.bmBitsPixel * PicInfo.bmHeight / 8
     
        ReDim PicBits(Size) As Byte
        ReDim Matrice(PicInfo.bmHeight, PicInfo.bmWidth) As Pixel
     
     
        GetBitmapBits Picture.Image, Size, PicBits(1)
     
        For i = 1 To PicInfo.bmHeight
            For j = 1 To PicInfo.bmWidth
                Z = (i - 1) * PicInfo.bmWidth * 4 + (j - 1) * 4 + 1
                Matrice(i, j).Blue = PicBits(Z)
                Matrice(i, j).Green = PicBits(Z + 1)
                Matrice(i, j).Red = PicBits(Z + 2)
            Next j
        Next i
     
        NHeight = PicInfo.bmHeight
        MWidth = PicInfo.bmWidth
     
    End Sub
    Private Sub ImageFromMatrix(Picture As PictureBox, Matrice() As Pixel)
        Dim PicBits() As Byte
        Dim i, j As Integer
        Dim Z As Long
     
        ReDim PicBits(UBound(Matrice(), 1) * UBound(Matrice(), 2) * 4)
     
     
     
        For i = 1 To UBound(Matrice(), 1)
            For j = 1 To UBound(Matrice(), 2)
                Z = Z + 1
     
                PicBits(Z) = Matrice(i, j).Blue
                PicBits(Z + 1) = Matrice(i, j).Green
                PicBits(Z + 2) = Matrice(i, j).Red
                PicBits(Z + 3) = 0
     
                Z = Z + 3
            Next j
        Next i
     
        SetBitmapBits Picture.Image, UBound(PicBits), PicBits(1)
        Picture.Refresh
    End Sub
    Private Sub Command1_Click()
    Dim chemin As String
    chemin = App.Path
    If Right(chemin, 1) <> "\" Then
    chemin = chemin & "\" & "Images-test\"
    End If
    chemin = chemin & "test-niveau-de-gris.jpg"
    Picture1.Picture = LoadPicture(chemin)
    End Sub
    Private Sub Command2_Click()
        Dim i, j As Integer
        Call MatrixFromImage(Picture1, Matrice())
        Picture2.Width = Picture1.Width
        Picture2.Height = Picture1.Height
     
        For i = 1 To NHeight
          For j = 1 To MWidth
            Matrice2(i, j).Blue = Gris(Matrice(i, j))
            Matrice2(i, j).Green = Gris(Matrice(i, j))
            Matrice2(i, j).Red = Gris(Matrice(i, j))
           Next j
         Next i
     
         Call ImageFromMatrix(Picture2, Matrice2())
     
     
     
    End Sub

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Bonjour,

    ça n'aurait rien à voir avec un QR code ton programme ? Reconnaissance d'image, niveau de gris, ça me dit vaguement quelquechose et ça semble être très à la mode.
    Sinon, je n'ai que survolé ton code mais je n'ai pas vu de redimensionnement de la variable Matrice2.
    De manière générale, quand tu rencontres une erreur, il est intéressant d'utiliser les fonctions de déboguage de VB6. Par exemple, avec cette erreur, dans la fenêtre exécution (si elle n'est pas visible : CTRL + G) tape :
    ? ubound(matrice2,1)

    Et tape

    ? ubound(matrice2,2)

    tu connaitras ainsi les dimensions de ton tableau (que tu pourras comparer aux dimensions de ton tableau 'Matrice' ).
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  3. #3
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Dans ta fonction gris, les membres de la structure pixels sont trois bytes
    Je comprends pas ce que peux donner un bloc.Blue / 65536 .
    la moyenne serait pas plutot Int((Bloc.Red + Bloc.Green + Bloc.Blue ) /3) ?

    cette ligne me parait suspecte
    ReDim PicBits(UBound(Matrice(), 1) * UBound(Matrice(), 2) * 4)

    Dans ta fonction ImageFromMatrix, tu tentes de copier une mtrice dans une autre, pour ensuite copier cette seconde matrice dans l'image. Heu pourqoui ne pas copier directement cette matrice dans l'image ?

    D'ailleurs, je vois pas pourqoui vous passez l'image dans une matrice, pourqoui ne pas lire les pixels de l'image et, à chaque pixel, modifier le pixel et remetre le pixel modifié dans l'image.

    Si la vitesse d'exécution n'est pas primordiale, Vb fournit deux fonctions permettant de manipuler les pixels d'une image
    Color = Point(X,Y) retourne la couleur du pixel
    PSet (X,Y),Color met le pixel à la couleur donnée
    ce qui donnerait ce code
    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
    Private Sub Command1_Click()
      Dim X As Integer
      Dim Y As Integer
      Dim Color As Long
      Picture1.ScaleMode = vbPixels
      Picture1.AutoRedraw = True
      Picture2.Width = Picture1.Width
      Picture2.Height = Picture1.Height
      Picture2.ScaleMode = vbPixels
      Picture2.AutoRedraw = True
      For X = 1 To Picture1.Width
        For Y = 1 To Picture1.Height
          Color = Picture1.Point(X, Y)
          Color = CalcGris(Color)
          Picture2.PSet (X, Y), Color
        Next
      Next
    End Sub
    Private Function CalcGris(Color As Long) As Long
      Dim Red As Long
      Dim Green As Long
      Dim Blue As Long
      Dim Gris As Long
      Red = Int(Color And &HFF)
      Green = Int((Color And &H100FF00) / &H100)
      Blue = Int((Color And &HFF0000) / &H10000)
      Gris = Int((Red + Green + Blue) / 3)
      CalcGris = RGB(Gris, Gris, Gris)
    End Function
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

Discussions similaires

  1. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 09h59
  2. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 10h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 16h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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