Click here to Skip to main content
14,921,745 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
import os, Image, ImageColor, ImageDraw
from collections import deque

def floodfill(img, 
              (startx, starty), 
    if useQueue:
        workpile = deque();
        getpoint = workpile.popleft
        workpile = []
        getpoint = workpile.pop


    while len(workpile)> 0:
        if len(workpile)> max: 

        if img.getpixel((x,y)) == targetcolour:
            img.putpixel((x,y), newcolour)
            # every few pixels drawn, dump an image showing our progress
            count += 1
            if (count%dumpEveryX)==0 and pattern != None:

            # this demo code doesn't handle the case where we get to the edge
            if img.getpixel((x-1,y))== targetcolour: workpile.append((x-1,y))
            if img.getpixel((x+1,y))== targetcolour: workpile.append((x+1,y))
            if img.getpixel((x,y-1))== targetcolour: workpile.append((x,y-1))
            if img.getpixel((x,y+1))== targetcolour: workpile.append((x,y+1))

    print '    done with count %d, max %d' % (count,max)
    return count

def make_floodfill_example(filename, use_queue):
    print 'making image '+filename
    print '  removing old files'
    os.system('rm -f out*.png ' +filename )

    i ='RGB', (200,200), 'white')

    # draw a rough ying-yang
    draw = ImageDraw.Draw(i)
    draw.ellipse((30,30,170,170), outline='black')
    draw.arc((65,100,135,170), 90,270, fill='black')
    draw.arc((64,30,134,100), 270,90, fill='black')
    draw.ellipse((80,45,120,85), outline='black')
    draw.ellipse((80,115,120,155), outline='black')
    del draw

    print '  filling'
    redcount = floodfill(i, 
                         (100, 90), 
                         (255,255,255), #white
                         (255,0,0), #red
                         useQueue = use_queue,

    print '  filling'
    bluecount = floodfill(i,
                          (255,255,255), # white
                          (0,0,255), # blue
                          useQueue = use_queue,

    # push some extra frames of animation so we can see the finished fill
    for x in range(redcount+bluecount,redcount+bluecount+20):'out_%05d.png' %(x))    

    print '  converting to animated GIF - this may take several minutes'
    os.system ('convert -loop 0 out*.png '+filename)

# draw one example image using a FIFO as the means of storing points,
# and another using a LIFO.
make_floodfill_example('wfm_floodfill_animation_queue.gif', True)
make_floodfill_example('wfm_floodfill_animation_stack.gif', False)
print 'done'

What I have tried:

I don't understand it, I need its solution please help
Updated 20-Jul-20 5:47am
CHill60 20-Jul-20 10:46am
If you don't understand it then why do you have it?
What, if any, research have you already done?

You cannot 'convert' that to C code, you need to write it from scratch and use the Windows GDI+ libraries for rendering of your images. See GDI+ - Win32 apps | Microsoft Docs[^].

Actually, if you are running that on a Unix/Linux system (which is what the code assumes) you will need to learn the appropriate GUI libraries in use on that system.
Step 1: Learn Python.
Step 2: Learn C.
Step 3: Use the Python code as a specification for a new C app.

Never convert languages, it doesn't produce good code in the target language because it uses a totally different framework, and the data structures that make something work well in the source language are normally very different in the target language.

And when you start talking about C and graphics ... you have to be pretty specific as to the C system you are using and the libraries it provides to do that. Which will bear little or no resemblance to PHP framework methods.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900