Canvas 如何使用turtle.py生成非常宽的图像?

Canvas 如何使用turtle.py生成非常宽的图像?,canvas,ghostscript,turtle-graphics,postscript,Canvas,Ghostscript,Turtle Graphics,Postscript,我已经搜索了“PIL tkinter canvas”的各种变体。我发现的最接近的东西是: py在可滚动的tkinter画布上创建图像,因此我根据上面的答案编写了一个脚本 #! /usr/bin/python3 import sys print(sys.argv[0]) sys.path.append('C:\\Program Files\\gs\\gs9.21\\bin\\') # Where Ghostscript lives import turtle as t from PIL imp

我已经搜索了“PIL tkinter canvas”的各种变体。我发现的最接近的东西是:

py在可滚动的tkinter画布上创建图像,因此我根据上面的答案编写了一个脚本

#! /usr/bin/python3

import sys
print(sys.argv[0])
sys.path.append('C:\\Program Files\\gs\\gs9.21\\bin\\') # Where Ghostscript lives
import turtle as t
from PIL import Image  
def line(nPlots=0,x0=0,y0=0,H=6000):
    t.penup()
    t.goto(x0,y0)
    #t.setheading(90)
    t.begin_fill()
    t.pendown()
    print('Forward:',H)
    t.forward(H)
t.screensize(12000,700)
t.color('red','light blue')
t.width(20)
t.tracer(10000)
line()

c=t.getcanvas()
t.update()
c.update()
import io
def savecanvas():
    screen=t.getscreen()
    canvas=screen.getcanvas()
    postscript=canvas.postscript().encode('utf-8')
    im=Image.open(io.BytesIO(postscript))
    im.save('canvas.png')
savecanvas()
这确实会产生一个屏幕截图,但不是一个完整的画布截图。输出文件的长度要求为12000像素,但长红色条会根据屏幕大小进行剪裁。罪魁祸首似乎是幽灵脚本边界框。以下是gs文件的一个片段:

内嵌:b“%!PS-Adobe-3.0 EPSF-3.0\n%%创建者:Tk画布 Widget\n%%Title:Window.!canvas\n%%CreationDate:Sat Apr 29 10:36:40 2017\n%%边界框:-197188 811605\

Ghostscript在从PIL图像模块调用的PIL EpsImagePlugin.py中设置

这是代码:

# Build ghostscript command
command = ["gs",
           "-q",                         # quiet mode
           "-g%dx%d" % (12000, 800),     # set output geometry (pixels)
           "-r%fx%f" % (96,96),          # set input DPI (dots per inch)
           "-dNOPAUSE",                  # don't pause between pages,
           "-dSAFER",                    # safe mode
           "-sDEVICE=ppmraw",            # ppm driver
           "-sOutputFile=%s" % outfile,  # output file
           "-c", "%d %d translate" % (-300,-375),
                                         # adjust for image origin
           "-f", infile,                 # input file
我试图强制bbox,但没有成功。我怀疑我需要一些额外的gs命令行选项


有人知道如何强制Ghostscript接受大范围的输入图像吗?

这不是Ghostscript的边界框,它是PostScript程序声明的边界框。显然是由“TK Canvas Widget”生成的,所以如果它错了,罪魁祸首不是Ghostscript

请注意,Ghostscript将完全忽略这一点,因为它是一个注释(以“%”开头),除非您设置了
-dEPSCrop
,但您没有设置。因为它声称是一个EPS文件(此注释:“%!PS-Adobe-3.0 EPSF-3.0”),请尝试使用
-dEPSCrop

我还将使用EPS文件,并尝试直接从EPS文件的命令行运行Ghostscript。命令行中有很多开关,我怀疑这些开关只会使事情变得复杂

首先,我会删除
-g
开关,因为这将设置一个固定大小的媒体(以像素为单位),如果您想要一个可变的媒体大小,您不想固定它,除非您还设置了
-dPSFitPage
,它将缩放请求的媒体(如果您使用
-dEPSCrop
,则由边界框给出)按照
-g
给定的固定页面大小。起初,至少我会放弃这个,它只是在碍事

然后您可能还想删除
-c“…”-f
,因为这会改变媒体上的内容


如果你做到了所有这些,我希望Ghostscript能以要求的分辨率为你生成一个ppmraw文件,并包含整个内容。当然,这并不能证明它是“完整的”。如果它不是完整的,那么你可能需要提供一个示例来查看。

我将对@KenS给出一个矛盾的答案,然后说PoTK Canvas小部件生成的stScript看起来不错。我使用了以下代码简化来转储PostScript:

from turtle import Turtle, Screen

def line(turtle, H=6000):
    turtle.penup()
    turtle.begin_fill()
    turtle.pendown()
    turtle.forward(H)

def savecanvas(screen):
    canvas = screen.getcanvas()
    canvas.postscript(file="canvas.eps")

screen = Screen()
screen.setup(12000, 700)

yertle = Turtle()
yertle.pencolor('red')
yertle.width(20)

line(yertle)

savecanvas(screen)

screen.bye()
然后我通过grep检查了它,并在我的Mac上预览:

> grep BoundingBox canvas.eps
%%BoundingBox: -5696 46 6309 746
> 


由此,我能够生成一个非常宽的(12505×729)PNG文件通过预览。因此,我发现很难对TK Canvas小部件生成的PostScript进行指责,至少在我的苹果系统上是这样。

请不要误解我的意思,我说如果BoundingBox是错误的……然后我继续详细介绍了使用EPS文件的各种方式,这些方式可能会导致意外的结果。顺便说一句,如果您的EPS上的e边界框似乎与问题中引用的边界框大不相同……我运行了cdlane代码。在我的设置中,我仍然得到了剪裁结果:(我似乎取得了一些进展。cdlane提供的代码在我的环境中都生成%%BoundingBox:-197 188 811 605\。如果我只是在画布中替换一些大值,eps代码,例如,%%BoundingBox:-8197 188*811 605\然后调用gswin64.exe-dEPSCrop canvas.eps,我会得到一个长条,它位于一个大的可滚动windo中。)w、 我花了很长时间才找到Tk从构建内嵌(我将其命名为canvas.eps)中提取其模板的地方,但至少这表明隧道的尽头是光明的。