【问题标题】:Save turtle output as jpeg将海龟输出保存为 jpeg
【发布时间】:2014-09-22 21:10:03
【问题描述】:

我有一个分形图像创建器。它创建了一个随机分形树之类的东西。完成后,它会提示用户保存树。我现在将它保存为 .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()

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    它必须是 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 创建的文件?
    • tmp.svg 只是一个临时文件名.. 你可以选择任何你喜欢的名字。因为临时文件是在临时目录中创建的(具有随机名称),所以您的文件将是唯一的,您不必担心名称冲突。
    • 我以前没有使用过 os 和 tempfile 但是这个错误听起来好像 tmpfile 变量有问题......它不是在创建那个目录吗? tempfile 是否为文件命名,或者我们是否需要以某种方式将 nameSav 应用于它?更新:刚刚进入错误中的那个目录,tmp.svg 在那里,它确实是最后一个创建的图像....呵呵
    • 好吧,现在没有错误,除了 canvas2svg 警告:不支持“图像”类型的项目。但在我能看到的任何地方仍然没有 png 输出....
    • 您的应用程序无权在运行应用程序的任何目录(当前工作目录)中创建输出 .png 文件。当您通过启动器直接运行 python 时,工作目录可能会有所不同。要解决此问题,请通过os.chdir() 更改脚本目录,在open() 中包含目录路径(例如open(os.path.join(savedir, nameSav), 'wb')),或让用户输入包含路径的文件名。
    猜你喜欢
    • 2022-08-11
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多