Canvas 如何使用turtle.py生成非常宽的图像?
我已经搜索了“PIL tkinter canvas”的各种变体。我发现的最接近的东西是: py在可滚动的tkinter画布上创建图像,因此我根据上面的答案编写了一个脚本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
#! /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)中提取其模板的地方,但至少这表明隧道的尽头是光明的。