traitement Image

traitement Image - VB/VBA/VBS - Programmation

Marsh Posté le 09-11-2010 à 23:17:11    

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 :
  1. 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 :
  1. Option Explicit
  2. Option Base 1
  3. Private Type BITMAP
  4.     bmType As Long
  5.     bmWidth As Long
  6.     bmHeight As Long
  7.     bmWidthBytes As Long
  8.     bmPlanes As Integer
  9.     bmBitsPixel As Integer
  10.     bmBits As Long
  11. End Type
  12. Private Type Pixel
  13.     Red As Byte
  14.     Green As Byte
  15.     Blue As Byte
  16. End Type
  17. Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  18. Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
  19. Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
  20. Dim Matrice() As Pixel
  21. Dim Matrice2() As Pixel
  22. Dim Rvb As Long
  23. Dim NHeight, MWidth As Integer
  24. 'renvoi le niveau de gris du Rvb
  25. Private Function Gris(bloc As Pixel) As Long
  26.   Dim Moyenne As Long
  27.   Moyenne = (bloc.Red + (bloc.Green / 256) + (bloc.Blue / 65536)) / 3
  28.   Gris = RGB(Moyenne, Moyenne, Moyenne)
  29. End Function
  30. '***************************************************************************
  31. 'Procedure qui copie une image PictureBox vers une matrice de pixels
  32. Private Sub MatrixFromImage(Picture As PictureBox, Matrice() As Pixel)
  33.    
  34.     Dim PicBits() As Byte, PicInfo As BITMAP
  35.     Dim Size As Long
  36.     Dim i, j As Integer
  37.     Dim Z As Long
  38.    
  39.     GetObject Picture.Image, Len(PicInfo), PicInfo
  40.    
  41.     Size = PicInfo.bmWidth * PicInfo.bmBitsPixel * PicInfo.bmHeight / 8
  42.    
  43.     ReDim PicBits(Size) As Byte
  44.     ReDim Matrice(PicInfo.bmHeight, PicInfo.bmWidth) As Pixel
  45.    
  46.    
  47.     GetBitmapBits Picture.Image, Size, PicBits(1)
  48.    
  49.     For i = 1 To PicInfo.bmHeight
  50.         For j = 1 To PicInfo.bmWidth
  51.             Z = (i - 1) * PicInfo.bmWidth * 4 + (j - 1) * 4 + 1
  52.             Matrice(i, j).Blue = PicBits(Z)
  53.             Matrice(i, j).Green = PicBits(Z + 1)
  54.             Matrice(i, j).Red = PicBits(Z + 2)
  55.         Next j
  56.     Next i
  57.    
  58.     NHeight = PicInfo.bmHeight
  59.     MWidth = PicInfo.bmWidth
  60.    
  61. End Sub
  62. Private Sub ImageFromMatrix(Picture As PictureBox, Matrice() As Pixel)
  63.     Dim PicBits() As Byte
  64.     Dim i, j As Integer
  65.     Dim Z As Long
  66.    
  67.     ReDim PicBits(UBound(Matrice(), 1) * UBound(Matrice(), 2) * 4)
  68.    
  69.    
  70.    
  71.     For i = 1 To UBound(Matrice(), 1)
  72.         For j = 1 To UBound(Matrice(), 2)
  73.             Z = Z + 1
  74.            
  75.             PicBits(Z) = Matrice(i, j).Blue
  76.             PicBits(Z + 1) = Matrice(i, j).Green
  77.             PicBits(Z + 2) = Matrice(i, j).Red
  78.             PicBits(Z + 3) = 0
  79.            
  80.             Z = Z + 3
  81.         Next j
  82.     Next i
  83.    
  84.     SetBitmapBits Picture.Image, UBound(PicBits), PicBits(1)
  85.     Picture.Refresh
  86. End Sub
  87. Private Sub Command1_Click()
  88. Dim chemin As String
  89. chemin = App.Path
  90. If Right(chemin, 1) <> "\" Then
  91. chemin = chemin & "\" & "Images-test\"
  92. End If
  93. chemin = chemin & "test-niveau-de-gris.jpg"
  94. Picture1.Picture = LoadPicture(chemin)
  95. End Sub
  96. Private Sub Command2_Click()
  97.     Dim i, j As Integer
  98.     Call MatrixFromImage(Picture1, Matrice())
  99.     Picture2.Width = Picture1.Width
  100.     Picture2.Height = Picture1.Height
  101.    
  102.     For i = 1 To NHeight
  103.       For j = 1 To MWidth
  104.         Matrice2(i, j).Blue = Gris(Matrice(i, j))
  105.         Matrice2(i, j).Green = Gris(Matrice(i, j))
  106.         Matrice2(i, j).Red = Gris(Matrice(i, j))
  107.        Next j
  108.      Next i
  109.    
  110.      Call ImageFromMatrix(Picture2, Matrice2())
  111.    
  112.  
  113.      
  114. End Sub

Message cité 1 fois
Message édité par lio-12 le 09-11-2010 à 23:19:30
Reply

Marsh Posté le 09-11-2010 à 23:17:11   

Reply

Marsh Posté le 10-11-2010 à 17:15:45    

personne :( ?

Reply

Marsh Posté le 10-11-2010 à 19:06:28    

lio-12 a écrit :


Code :
  1. 'renvoi le niveau de gris du Rvb
  2. Private Function Gris(bloc As Pixel) As Long
  3.   Dim Moyenne As Long
  4.   Moyenne = (bloc.Red + (bloc.Green / 256) + (bloc.Blue / 65536)) / 3
  5.   Gris = RGB(Moyenne, Moyenne, Moyenne)
  6. End Function



Sans vraiment m'y connaitre en vb je dirais que ta fonction Gris() renvoie un pixel entier et non juste une composant blue.
Tu devrais renvoyer 'moyenne' au lieu de 'RVB(Moyenne, Moyenne,Moyenne) ?


---------------
Seul Google le sait...
Reply

Marsh Posté le 11-11-2010 à 00:18:42    

oui excuse moi c'est une erreur je l'avais pas modifié sur le post ;)

Reply

Marsh Posté le 11-11-2010 à 22:34:36    

Toujours pas?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed