Nerdy Birdy Ответов: 2

Как преобразовать этот код Python в код C?


import os, Image, ImageColor, ImageDraw
from collections import deque

def floodfill(img, 
              (startx, starty), 
              targetcolour, 
              newcolour, 
              dumpEveryX=70,
              pattern=None,
              useQueue=False,
              startIndex=0):
    
    if useQueue:
        workpile = deque();
        getpoint = workpile.popleft
    else:
        workpile = []
        getpoint = workpile.pop

    max=0
    count=0

    workpile.append((startx,starty))
    while len(workpile)> 0:
        x,y=getpoint()
        
        if len(workpile)> max: 
            max=len(workpile)

        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:
                img.save(pattern %(startIndex+count))

            # 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 = Image.new('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,
                         pattern='out_%05d.png')

    print '  filling'
    bluecount = floodfill(i,
                          (110,110),
                          (255,255,255), # white
                          (0,0,255), # blue
                          useQueue = use_queue,
                          pattern='out_%05d.png',
                          startIndex=redcount)

    # push some extra frames of animation so we can see the finished fill
    for x in range(redcount+bluecount,redcount+bluecount+20):
        i.save('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'


Что я уже пробовал:

Я этого не понимаю, мне нужно его решение, Пожалуйста, помогите

CHill60

Если вы не понимаете этого, тогда зачем оно вам?
Какие исследования вы уже провели?

2 Ответов

Рейтинг:
2

Richard MacCutchan

Вы не можете "конвертировать" это в код C, вам нужно написать его с нуля и использовать библиотеки Windows GDI+ для рендеринга ваших изображений. Видеть GDI+ - Win32 apps | Microsoft Docs[^].

[редактировать]
На самом деле, если вы используете его в системе Unix/Linux (что и предполагает код), вам нужно будет изучить соответствующие библиотеки графического интерфейса, используемые в этой системе.
[/редактировать]


Рейтинг:
1

OriginalGriff

Шаг 1: Изучите Python.
Шаг 2: Изучите С.
Шаг 3: используйте код Python в качестве спецификации для нового приложения на языке Си.

Никогда не конвертируйте языки, он не создает хороший код на целевом языке, потому что он использует совершенно другую структуру, а структуры данных, которые заставляют что-то хорошо работать на исходном языке, обычно очень отличаются на целевом языке.

И когда вы начинаете говорить о C и графике ... вы должны быть довольно конкретны в отношении используемой вами системы СИ и библиотек, которые она предоставляет для этого. Которые имеют мало или ничего общего с PHP-фреймворками методов.