Frage

Ich habe einen Fraktalbild-Ersteller.Es entsteht ein zufälliges Fraktalbaum-ähnliches Ding.Wenn dies erledigt ist, wird der Benutzer aufgefordert, den Baum zu speichern.Ich speichere es gerade als .svg und das funktioniert, ABER ich möchte, dass es in einem praktischeren Dateityp wie jpeg gespeichert wird.Irgendwelche Ideen?Code:

import turtle
import random
from sys import exit
from time import clock
import canvasvg
turtle.colormode(255)
red = 125
green = 70
blue = 38        
pen = 10
def saveImg():
    print("Done.")
    save = input("Would you like to save this tree? Y/N \n")
    if save.upper() == "Y":
        t.hideturtle()
        name = input("What would you like to name it? \n")
        nameSav = name + ".svg"
        ts = turtle.getscreen().getcanvas()
        canvasvg.saveall(nameSav, ts)
    elif save.upper() == "N":
        def runChk():
            runAgain = input("Would you like to run again? Y/N (N will exit)")
            if runAgain.upper() == "Y":
                print("Running")
                main()
            elif runAgain.upper() == "N":
                print("Exiting...")
                exit()
            else:
                print("Invalid response.")
                runChk()
        runChk()
    else:
        print("Invalid response.")
        saveImg()

def tree(branchLen, t, red, green, blue, pen):
    time = str(round(clock()))
    print("Drawing... " + time)
    if branchLen > 3:
        pen = pen*0.8
        t.pensize(pen)
        if (red > 10 and green < 140):
            red = red - 15
            green = green + 8
    if branchLen > 5:
        angle = random.randrange(18, 55)
        angleTwo = 0.5*angle
        sub = random.randrange(1,16)
        t.color(red, green, blue)
        t.forward(branchLen)
        t.right(angleTwo)
        tree(branchLen-sub,t, red, green, blue, pen)
        t.left(angle)
        tree(branchLen-sub, t, red, green, blue, pen)
        t.right(angleTwo)
        t.backward(branchLen)

def main():
    t = turtle.Turtle()
    myWin = turtle.Screen()
    t.speed(0)
    t.hideturtle()
    t.left(90)
    t.up()
    t.backward(100)
    t.down()
    print("Please wait while I draw...")
    tree(random.randrange(60,95),t,red,green,blue, pen)
    saveImg()
main()
War es hilfreich?

Lösung

Muss es ein JPEG sein?Würde PNG ausreichen?

Wenn ja, können Sie mit von SVG in PNG konvertieren cairosvg.Bedauerlicherweise canvasvg.saveall() Ermöglicht Ihnen nur die Übergabe eines Dateinamens, in den die SVG-Datei geschrieben wird. Sie müssen also eine temporäre Datei für die SVG-Datei verwenden und diese temporäre Datei dann mit in PNG konvertieren cairosvg.svg2png().Also sollte so etwas funktionieren:

import os
import shutil
import tempfile

import canvasvg

name = raw_input("What would you like to name it? \n")
nameSav = name + ".png"
tmpdir = tempfile.mkdtemp()  # create a temporary directory
tmpfile = os.path.join(tmpdir, 'tmp.svg')  # name of file to save SVG to
ts = turtle.getscreen().getcanvas()
canvasvg.saveall(tmpfile, ts)
with open(tmpfile) as svg_input, open(nameSav, 'wb') as png_output:
    cairosvg.svg2png(bytestring=svg_input.read(), write_to=png_output)
shutil.rmtree(tmpdir)  # clean up temp file(s)

Wenn Sie möchten, können Sie auch Ihr eigenes schreiben saveall() Funktion basierend auf canvasvg.saveall() (es ist ziemlich klein), das ein dateiähnliches Objekt anstelle eines Dateinamens akzeptiert und in dieses Objekt schreibt.Dann können Sie eine übergeben StringIO Objekt und müssen sich nicht um die temporäre Datei kümmern.Oder Ihre saveall() könnte die SVG-Daten einfach als Byte-String zurückgeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top