将海龟输出保存为jpeg格式。

8

我有一个分形图像创建器。它创建一个类似随机分形树的东西。完成后,它会提示用户保存这个树。目前,我已经将其保存为.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()
1个回答

7

必须使用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)

如果您愿意的话,可以基于canvasvg.saveall()编写自己的saveall()函数(它非常小),该函数接受类似文件的对象而不是文件名,并将其写入该对象。然后,您可以传入一个StringIO对象,而无需担心临时文件。或者您的saveall()函数可以直接返回SVG数据作为字节字符串。

啊,没错,PNG 格式应该可以。我明天试试看…… tmp.svg 是指 nameSav 吗?还是 tmp.svg 是由 os.path 创建的文件? - Lillz
1
好的,现在没有错误了,除了canvas2svg警告:不支持'image'类型的项目。但是我仍然看不到任何png输出... - Lillz
不,我对海龟图形一无所知。有很多资源可用。如果您有具体问题,可以在新问题中提出。 - mhawke
1
您的应用程序没有在任何目录(即当前工作目录)中创建输出 .png 文件的权限。假定当您直接通过启动器运行 Python 时,工作目录是不同的。 要解决此问题,请让您的脚本通过 os.chdir() 更改目录,将目录路径包含在 open() 中(例如 open(os.path.join(savedir, nameSav), 'wb')),或要求用户输入包含路径的文件名。 - mhawke
显然,canvasvg不再具有saveall属性。 - 355durch113
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接