Mrreivax
Messages postés100Date d'inscriptionmercredi 9 juin 2004StatutMembreDernière intervention26 juin 2010
-
26 juin 2010 à 16:54
Mrreivax
Messages postés100Date d'inscriptionmercredi 9 juin 2004StatutMembreDernière intervention26 juin 2010
-
26 juin 2010 à 17:42
Bonjour à tous!
J'ai un petit soucis, que je ne comprends pas trop...
Je suis sur une image Noir & Blanc. Je souhaiterai "remplir" à la manière de "Fill" une zone de pixels noires contiguës. Pour ce faire, j'utilise une méthode récursive qui parcoure les 4 pixels voisins (Haut, Bas, Gauche, Droite). Cela marche très bien, sauf qu'à partir d'un certain moment, j'ai un "StackOverflow", et je ne sais pas comment y remédier ...
Voilà le code qui m'embête:
Dim curBitmap As Bitmap
' Les pixels voisins à ne pas tester
Enum _cotes
tous
gauche
droite
bas
haut
End Enum
' Fonction récursive
Sub recusiv(ByVal x As Integer, ByVal y As Integer, ByVal nepasfaire As _cotes)
curBitmap.SetPixel(x, y, Color.Red)
'PictureBox1.Image = curBitmap
Application.DoEvents()
' A droite
If nepasfaire <> _cotes.droite And isBlack(curBitmap.GetPixel(x + 1, y)) Then
recusiv(x + 1, y, _cotes.gauche)
End If
' A gauche
If nepasfaire <> _cotes.gauche And isBlack(curBitmap.GetPixel(x - 1, y)) Then
recusiv(x - 1, y, _cotes.droite)
End If
' En bas
If nepasfaire <> _cotes.bas And isBlack(curBitmap.GetPixel(x, y + 1)) Then
recusiv(x, y + 1, _cotes.haut)
End If
' En haut
If nepasfaire <> _cotes.haut And isBlack(curBitmap.GetPixel(x, y - 1)) Then
recusiv(x, y - 1, _cotes.bas)
End If
End Sub
Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick
curBitmap = PictureBox1.Image
recusiv(e.X, e.Y, _cotes.tous)
PictureBox1.Image = curBitmap
MsgBox("Fin !")
End Sub
' Si le pixel est plus noir que blanc
Function isBlack(ByVal c As Color) As Boolean
If (c.R + c.G + c.B) / 3 < 100 Then
Return True
Else
Return False
End If
End Function
raffika
Messages postés269Date d'inscriptiondimanche 31 mai 2009StatutMembreDernière intervention12 mars 2011 26 juin 2010 à 17:37
Salut, j'ai pas tout compris à ton code
mais il semble que ça donne une boucle infinie
puisque recusiv est appelée à chaque fois ?
Sinon qu'est ce que tu veux faire ?
Il y a peu être une autre méthode
que celle ci pour arriver à ton but ?