如何在Python 3中将Turtle对象(turtle.py)保存为.png或.jpg?

问题描述 投票:1回答:2

我一直在使用turtle模块,并希望以此为起点来开发可以识别数字/字母的简单图像识别程序。我需要将乌龟另存为可以操纵的图像,例如重新缩放,旋转等,以尝试调整图像。我已经研究了几个小时,似乎找不到任何有效的方法。我发现了如何将Turtle输出保存为Tkinter画布:

import turtle
t = turtle.Turtle()
# Draw something
canvas = t.getscreen().getcanvas()  # Saves a Tkinter canvas object

这似乎很棒。下一步是将其另存为.png或.jpg。但是,我唯一能找到的就是如何将其另存为Postscript文件:

canvas.postscript(file="turtle_img.ps")  # Saves as a .ps file

[从那里,我试图使用PIL将.ps文件转换为.png或.jpeg文件。这是我的代码以及出现的错误:

from PIL import Image
turtle_img = Image.open("turtle_img.ps")
turtle_img.save("turtle_img", "png")
# Also tried:   turtle_img.save("turtle_img, "jpeg")

运行“ turtle_img.save(” turtle_img“,” png“)行会产生:

OSError: Unable to locate Ghostscript on paths

我希望以下其中一项:1.一种将.ps转换为.jpeg,.png甚至位图的方法2.另一种保存Tkinter画布的方法,更易于使用

编辑:我想澄清的是,我将使用大量此类文件,并且希望在脚本中自动执行该过程,而不是对每个图像使用命令行。

所有答案将不胜感激!提前谢谢。

python-3.x tkinter ghostscript tkinter-canvas python-turtle
2个回答
1
投票

您可以使用Ghostscript将PostScript程序呈现为位图。例如:

gs -sDEVICE=png16m -o out.png input.ps

[还有其他文件格式和颜色深度,例如png256,jpeg等。如果是多页输入文件,则:

gs -sDEVICE=png16m -o out%d.png input.ps

0
投票

如果将.png包含在turtle中,则可以直接将画布另存为tkinter canvas。这很容易做到。

然后可以自动抓取.png图像,或者单击按钮或按一下键即可。

这里是将turtle嵌入tk.Canvas中,绘制Sierpinski垫片并自动将生成的图像保存在磁盘上的示例。

enter image description here

import tkinter as tk
from PIL import ImageGrab
import turtle


def dump_gui():
    """
    takes a png screenshot of a tkinter window, and saves it on in cwd
    """
    print('...dumping gui window to png')

    x0 = root.winfo_rootx()
    y0 = root.winfo_rooty()
    x1 = x0 + root.winfo_width()
    y1 = y0 + root.winfo_height()
    ImageGrab.grab().crop((x0, y0, x1, y1)).save("gui_image_grabbed.png")


def draw_sierpinski(length,depth):
    if depth==0:
        for i in range(0,3):
            t.fd(length)
            t.left(120)
    else:
        draw_sierpinski(length/2,depth-1)
        t.fd(length/2)
        draw_sierpinski(length/2,depth-1)
        t.bk(length/2)
        t.left(60)
        t.fd(length/2)
        t.right(60)
        draw_sierpinski(length/2,depth-1)
        t.left(60)
        t.bk(length/2)
        t.right(60)


root = tk.Tk()
canvas = tk.Canvas(root, width=500, height=500)
canvas.pack()

t = turtle.RawTurtle(canvas)

draw_sierpinski(150, 4)
dump_gui()

root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.