Turtle --> .eps --> .png

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo ich habe mir ein Script geschrieben das mir 20 zufällige Icons generiert.
Das habe ich mit Turtle umgesetzt das Icon wird als .eps exportiert, 20 mal vergrössert und zu png konvertiert.
Meine Frage ist nun: Wie kann ich das Icon als transparentes png speichern?
Ich hoffe ihr könnt mir helfen🤗🤗

Code: Alles auswählen

import turtle
import random
from PIL import Image
import os
Image.MAX_IMAGE_PIXELS = None
colors=["green", "blue", "magenta", "purple", "yellow", "green", "blue", "magenta", "purple", "yellow"]
for a in range(20):
    turtle.tracer(0, 0)
    new_colors = random.sample(colors, k=6)
    t=turtle.Pen()
    t.hideturtle()
    t.speed(0)
    turtle.bgcolor("black")
    for x in range(360):
        t.pencolor(new_colors[x%6])
        t.width(x/100+1)
        t.forward(x)
        t.left(59)
    turtle.update()
    canvas = t.getscreen()
    filename = f"/media/usb/Bilder/Icon{a}"
    canvas.getcanvas().postscript(file=f"{filename}.eps", colormode = "color")
    image = Image.open(f"{filename}.eps")
    image.load(scale=20)
    image.save(f"{filename}.png")
    os.remove(filename)
    t.clear()
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Kritik am Skript: Code auf Modulebene — nicht gut.

Die Farben stehen 2× in der Liste. Es ist weniger fehleranfällig und offensichtlicher das die da zweimal stehen, wenn man sie nur einmal schreibt und die Liste dann mit 2 ”multipliziert”.

`a` ist ein sehr ungewöhnlicher und damit kein guter Name für einen Laufindex. `i` ist *der* Name für so etwas.

`t` ist auch kein guter Name. Wer kommt denn bitte bei dem Namen `t` darauf das sich dahinter ein `Pen`-Objekt verbirgt?

`canvas` ist kein guter Name wenn es sich gar nicht um einen `Canvas` handelt. Darum sieht auch das `canvas.getcanvas()` komisch/falsch aus.

Für Pfad/Dateinamenoperationen würde ich `pathlib` verwenden. Dein `os.remove()` dürfte auch nicht funktionieren weil bei Deinem `filename` die Dateinamenserweiterung fehlt.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import random
import turtle
from itertools import cycle
from pathlib import Path

from PIL import Image

IMAGE_PATH = Path("/media/usb/Bilder")


def main():
    Image.MAX_IMAGE_PIXELS = None
    colors = 2 * ["green", "blue", "magenta", "purple", "yellow"]
    for i in range(20):
        turtle.tracer(0, 0)
        pen = turtle.Pen()
        pen.hideturtle()
        pen.speed(0)
        turtle.bgcolor("black")
        for x, color in zip(range(360), cycle(random.sample(colors, k=6))):
            pen.pencolor(color)
            pen.width(x / 100 + 1)
            pen.forward(x)
            pen.left(59)
        turtle.update()

        filename = IMAGE_PATH / f"Icon{i}.eps"
        pen.getscreen().getcanvas().postscript(
            file=filename, colormode="color"
        )
        image = Image.open(filename)
        image.load(scale=20)
        image.save(filename.with_suffix(".png"))
        filename.unlink()
        pen.clear()


if __name__ == "__main__":
    main()
Zum Problem mit der Transparenz: Es gibt im EPS keine Transparenz. Es gibt Software die kann das über Umwege, aber da müssen dass dann auch beide Seiten unterstützen — die Software die es schreibt und die die es liest. Weder Tk noch PIL können/machen das.

Man könnte mit PIL die weissen Pixel transparent machen. Also entsprechend eine Maske daraus generieren und mit `putalpha()` setzen.

Oder man benutzt nicht Tk zum schreiben sondern generiert gleich eine Vektorgrafik die Transparenz beherrscht, beispielsweise SVG. Dann kann man sich vielleicht auch die Umwandlung in PNG sparen und gleich die SVG-Datei weiterverwenden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich gebe zu die Namen sind sehr schlecht, wahr nur ein test und danke für deine Idee.😃
Ich werde versuchen sie umzusetzen.
Antworten