FloodFill - best way?

BlitzPlus Forums/BlitzPlus Programming/FloodFill - best way?

Jürgen(Posted 2003) [#1]
Hy, I'm writing a Paint Program and I've to solve a very simple thing: the flood fill. But this isn't as easy as I thaught...

I tried a recoursive function:
1. Get Pixelcolor.
2. if Color correct fill the pixel
3. if Color correct goto step 1 but with the pixel -left ,-above, -right, -below
4. end function

It's a big time until the program reaches the Final End.
There's the code:

Global FillOnR,FillOnG,FillOnB,image=LoadImage("compiling.bmp")
DrawImage image,0,0 : Text 100,4,"please wait" : Delay 100
Fill(30,30   ,255,140,140  ,0)
DrawImage image,0,0
Repeat
Until GetKey()
End

;*************************************************************************
Function Fill(X,Y,R,G,B,level)
;If Rand(0,1000)=1 Then DrawImage image,0,0:Delay 10   ;activate to see process
If level>10000 Then Return                                                  ;safety
If X<0 Or Y<0 Or X>ImageWidth(image)-1 Or Y>ImageHeight(image)-1 Then Return;outside of image
col=ReadPixel(X,Y,ImageBuffer(image))
TheB=(col And 255) : TheG=(col Shr 8) And 255 : TheR=(col Shr 16) And 255   ;get the RGBcolors of position XY
If level=0 Then FillOnR=TheR : FillOnG=TheG : FillOnB=TheB                        ;get the color on which we are painting
If TheR=R And TheG=G And TheB=B Then Return                                 ;don't fill red on red etc
If TheR=FillOnR And TheG=FillOnG And TheB=FillOnB Then WritePixel(X,Y,R*256*256+G*256+B,ImageBuffer(image)) :Else Return ; actually fills the point in the image!

Fill(X+1,Y,R,G,B,level+1) ; try to fill right one
Fill(X-1,Y,R,G,B,level+1) ; try to fill left one
Fill(X,Y+1,R,G,B,level+1) ; try to fill below
Fill(X,Y-1,R,G,B,level+1) ; try to fill above

End Function
;*************************************************************************

The problems:
-it is slow
-sometimes it doesn't fill the whole thing because recoursive levels above 12000 cause Blitz to crash...
I wonder how Microsoft Paint does this thing. I click and next moment a huge and complex floodfill is complete!

So it looks like (with my little proggy):




fredborg(Posted 2003) [#2]
There is one in the Code Archives: Fast Flood Fill (ProPixel Code) by Snarty


Jürgen(Posted 2003) [#3]
Thank you very much, Fredborg!:-) I'll try this out.