如何将海龟 canvas 另存为图像(.png 或 .jpg)

How can I save a Turtle canvas as an image (.png or .jpg)

我一直在使用 turtle 模块,并希望以它为起点来开发一个可以识别 numbers/letters 的简单图像识别程序。我需要能够将乌龟保存为我可以操纵的图像 - 重新缩放、旋转等以尝试调节图像。我已经研究了几个小时,似乎找不到任何有用的东西。我发现了如何将 Turtle 输出保存为 Tkinter canvas:

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

这似乎很有效。下一步是将其另存为 .png 或 .jpg。然而,我唯一能找到的是如何将它保存为后记文件:

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 canvas 的方法更易于使用

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

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

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

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

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

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

然后可以自动抓取 .png 图像,或者通过单击按钮或按键来完成 - 无需人工干预

这里有一个例子,在tk.Canvas中嵌入turtle,绘制一个Sierpinski Gasket,并自动将生成的图像保存在磁盘上。

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)

t.penup()
t.goto(-200, -175)
t.pendown()
draw_sierpinski(400, 6)
t.hideturtle()

dump_gui()

root.mainloop()