在将python turtle canvas转换为位图时如何保持画布大小

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

我想将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位图?

python canvas tkinter bitmap
1个回答
2
投票

如果我们从分析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)

结果:

enter image description here

如果您有任何问题,请随时发表评论,我会尽力回复!

PS:

不要问我关于-1部分,它不会给我任何其他501x501像素,所以我补偿了这一点。我不知道为什么它仍然无法正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.