我想将Python Turtle模块(tkinter)画布转换为位图。我按照“How to convert a Python tkinter canvas postscript file to an image file readable by the PIL?”的建议将其转换为后记;然后我打开它作为PIL图像,然后将其保存为位图。但是位图与原始画布的大小不同。
import turtle
import io
from PIL import Image
myttl = turtle.Turtle()
wd=500
ht=500
turtle.setup(width=wd, height=ht, startx=0, starty=0)
turtle.mode('logo') # start pointing north
myttl.forward(100)
screen = turtle.Screen()
cv = screen.getcanvas()
ps = cv.postscript(colormode='mono')
img = Image.open(io.BytesIO(ps.encode('utf-8'))).convert(mode='1')
img.save('test.bmp')
在上面的代码中,画布是500x500。但文件test.bmp缩小到374x374,其图像小于屏幕上的海龟图形。我怎样才能得到一个不受影响的500x500位图?
如果我们从分析postscript内容开始,我们会看到它对画布的尺寸进行了0.7498的缩放
%%Page: 1 1
save
306.0 396.0 translate
0.7498 0.7498 scale
3 -241 translate
-244 483 moveto 239 483 lineto 239 0 lineto -244 0 lineto closepath clip newpath
gsave
grestore
gsave
0 239 moveto
0 339 lineto
1 setlinecap
1 setlinejoin
1 setlinewidth
[] 0 setdash
0.000 0.000 0.000 setrgbcolor AdjustColor
stroke
grestore
gsave
grestore
gsave
0 339 moveto
-5 330 lineto
0 332 lineto
5 330 lineto
0 339 lineto
0.000 0.000 0.000 setrgbcolor AdjustColor
eofill
0 339 moveto
-5 330 lineto
0 332 lineto
5 330 lineto
0 339 lineto
1 setlinejoin 1 setlinecap
1 setlinewidth
[] 0 setdash
0.000 0.000 0.000 setrgbcolor AdjustColor
stroke
grestore
restore showpage
在对postscript进行了一些挖掘之后,我遇到了关于来自tkinter的canvas here的postscript转换的perl / Tk参考指南
你实际上可以做的是不仅设置colormode而且设置pagewidth / pageheight。这导致以下行被更改
ps = cv.postscript(colormode='mono')
至
ps = cv.postscript(colormode='mono', pagewidth=wd-1, pageheight=ht-1)
结果:
如果您有任何问题,请随时发表评论,我会尽力回复!
PS:
不要问我关于-1
部分,它不会给我任何其他501x501像素,所以我补偿了这一点。我不知道为什么它仍然无法正常工作。