質問
フラクタル画像作成者があります。それは物事のようなランダムなフラクタルツリーを作り出します。完了したら、ユーザーにツリーを保存するように求められます。私はそれが今では.svgとして保存されていて、それはうまくいきますが、JPEGのように、より便利なファイルの種類に保存したいです。何か案は? コード:
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()
. 解決
JPEGでなければなりませんか?PNGで十分であろう?
では、 cairosvg を使用してSVGからPNGに変換できます。残念ながら、canvasvg.saveall()
では、SVGを書き込むファイル名を渡すことができるため、SVGの一時ファイルを使用してから、cairosvg.svg2png()
を使用してその一時ファイルをPNGに変換する必要があります。だからこのようなものは仕事をするべきです:
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)
.
好きな場合は、ファイル名の代わりにファイルのようなオブジェクトを受け入れ、そのオブジェクトに書き込むことを基にして、独自のsaveall()
関数を作成できます。その後、canvasvg.saveall()
オブジェクトを渡すことができ、一時ファイルに気にする必要はありません。またはあなたのStringIO
はただSVGデータをバイト文字列として返すことができます。
所属していません StackOverflow