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
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.