Question

J'ai un créateur d'images fractales.Cela crée une chose semblable à un arbre fractal aléatoire.Une fois terminé, il invite l'utilisateur à enregistrer l'arborescence.Je l'ai enregistré au format .svg en ce moment et cela fonctionne MAIS je veux qu'il soit enregistré dans un type de fichier plus pratique, comme jpeg.Des idées?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()
Était-ce utile?

La solution

Est-ce que ça doit être un JPEG ?La PNG suffirait-elle ?

Si tel est le cas, vous pouvez convertir du SVG en PNG en utilisant le Caire.Malheureusement canvasvg.saveall() vous permet uniquement de lui transmettre un nom de fichier dans lequel il écrira le SVG, vous devrez donc utiliser un fichier temporaire pour le SVG, puis convertir ce fichier temporaire en PNG en utilisant cairosvg.svg2png().Donc quelque chose comme ça devrait faire l'affaire :

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)

Si tu voulais, tu pourrais écrire le tien saveall() fonction basée sur canvasvg.saveall() (c'est assez petit) qui accepte un objet de type fichier au lieu d'un nom de fichier et écrit dans cet objet.Ensuite, vous pouvez passer dans un StringIO objet et ne pas avoir à se soucier du fichier temporaire.Ou votre saveall() pourrait simplement renvoyer les données SVG sous forme de chaîne d'octets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top