Récupération d'une matrice de pixels à partir d'une image sans lire les valeurs des pixels sur l'écran et vice versa (ultra

Contenu du snippet

Dans une application de reconnaissance de forme, j'avais besoin d'une méthode pour récupérer les données d'une image sous forme d'une matrice et une autre pour générer une image à partir d'une matrice de couleurs. Je pouvais pas utiliser la fontction Point pour réucupérer les données d'une image et SetPixel pour générer l'image à partir de ma matrice car c'est super lent, et le temps de récupération des données d'une image peut atteindre plus de 6 minutes si l'image est d'une taille de 5000 px * 5000 px (c'est grand mais ça correspond à la taille des images de mon application). Après 4 jours de recherche voci le code que ça a donné : un code très simple pour faire la conversion dans les deux sens et c'est ultra rapide (Que c'est beau l'entraide !)

Source / Exemple :


'Le but de ce code est de pouvoir copier une image vers une matrice et vice versa.
'Pour illustrer ceci, ce code va premièrement copier une picturebox dans une matrice
'puis il va recopier cette même matrice dans une autre picture box et les deux
'transformations sont faites d'une manière directe sans passer pixel par pixel (Ultra rapides)

'Insérer deux images Picturebox dans une forme : Picture1 (Source) et Picture2 (Destination)

'Origine de la source (Largement modifiée)

    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net

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 NHeight, MWidth As Integer

'***************************************************************

'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

'***************************************************************

'Procedure qui copie une matrice de pixels vers une image PictureBox
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

'***************************************************************

'Corps du programme

Private Sub Form_Load()
    Dim i, j As Integer
    
    Picture1.Picture = LoadPicture("c:\candle.jpg")
    
    'Copie de l'image1 vers une matrice
    Call MatrixFromImage(Picture1, Matrice())
    
    
    'Exemple d'illustration : Inversion des couleurs de l'image
    'Tout les calculs se font maintenant sur la matrice
    
    For i = 1 To NHeight
        For j = 1 To MWidth
            Matrice(i, j).Blue = 255 - Matrice(i, j).Blue
            Matrice(i, j).Green = 255 - Matrice(i, j).Green
            Matrice(i, j).Red = 255 - Matrice(i, j).Red
        Next j
    Next i
    
    'Copie de la matrice vers l'image2
    Call ImageFromMatrix(Picture2, Matrice())
    
End Sub

Conclusion :


J'attends vos remarques, critiques bref ce que vous en pensez ;)
Bonne programmation à tous

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.