Seite 1 von 1

PIL: Flächen füllen

Verfasst: Mittwoch 17. Oktober 2007, 10:51
von no1
Hallo,

ich habe ein kleines Problem mit der Image-Library (PIL). Und zwar möchte flogende Grafik oberhalb des Graphen mit weißer Farbe füllen.

Bild


Das Ergebnis soll dann so aussehen:

Bild


Mein Ansatz zu der Lösung war jeden Pixel von (1,1) ausgehend rekursiv auf seine Farbe zu überprüfen und ggf. färben. Hier ist der Code dazu:

Code: Alles auswählen

imageWidth = 400
imageHeight = 200

def fillWhite(im,x,y):
    global imageWidth, imageHeight
    if x in range(1,imageWidth) and y in range(1,imageHeight):
        if im.getpixel((x,y)) == 0:
            im.putpixel((x,y), 255)
            fillWhite(im,x+1,y)
            fillWhite(im,x,y+1)

fillWhite(im,1,1)
Das Problem ist nur, dass das Ganze für das Bild (400x200) schon ca. 15 Sekunden dauert. Ich möchte das Bild aber eigentlich mit mindestens 1200x600 Pixeln darstellen. Das dauert dann aber definitiv zu lange. Gibt es da nicht eine einfachere Lösung. Die gängigen Bildbearbeitungsprogramme machen das doch auch in Bruchteilen von Sekunden.

Im PIL-Handbuch bin ich nicht fündig geworden!

Wäre dankbar für Vorschläge und Ideen.

Gruß, Martin

Verfasst: Mittwoch 17. Oktober 2007, 12:46
von HWK
Sieh Dir das mal an: http://de.wikipedia.org/wiki/Floodfill
Wahrscheinlich wäre die iterative Flutfüllung effektiver. Viel Zeit dürfte aber auch hier durch unnötige Mehrfachüberprüfungen von Punkten verschwendet werden.
Hier dasselbe Problem: http://mail.python.org/pipermail/image- ... 01258.html
MfG
HWK

Verfasst: Mittwoch 17. Oktober 2007, 13:59
von mkesper
Wenn du die Kurve selbst zeichnest, käme eventuell die Erstellung eines "Pfades" (Begriff aus der Vektorgrafik), der die komplette weiße Fläche umschließt inkl. Füllung in Frage. Sowas kann laut Beschreibung mittlerweile aggdraw, welches im PIL-Handbuch erwähnt wird.