对于重复标记:我完全清楚matplotlib
中存在类似问题,例如this one。我的问题是关于Tkinter
而不是matplotlib
。
我现在将Lena导入python并用她的帽子画一个绿点
In [72]: from PIL import Image
....: import matplotlib.pylab as plt
....: im = Image.open('lena.jpg')
....: fig = plt.figure()
....: axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
....: axes.imshow(im)
....: axes.scatter(50, 50, marker='s', color='green')
Out[72]: <matplotlib.collections.PathCollection at 0xb3e2ef0>
(请忽略红点)
我现在希望绿点(50, 50)
仍然在Lena的帽子上,但我也希望在左下角而不是左上角绘制绿点。
我期待这样的事情:
如图所示,我设法在matplotlib
中轻松地执行此操作,并添加了一行:
axes.invert_yaxis()
我现在正在Tkinter
的画布上画画。
我怎样才能达到同样的效果?
更新
Lena仅仅是为了说明我的目的。在我真正的问题中,我没有在Tkinter
中导入任何内容。我只是在空白的画布上画画。我不愿意修改我的数据,我只希望将图纸颠倒过来。就像在我的Lena插图中一样,坐标仍为(50, 50)
。不同的是,现在它位于左下角而不是顶角。
答案 0 :(得分:2)
角度可以这样使用:
image = Image.open("lena.jpg")
angle = 180
tkimage = ImageTk.PhotoImage(image.rotate(angle))
...
可以绘制图片,并使用反转坐标(因此,当您知道画布的大小时,不要说50x50
,而是使用(max-50)x(max-50)
。
问题是axes.imshow
是否可以处理ImageTk.PhotoImage
。然后,我不完全确定你是否只想在Tkinter画布上使用它,例如:
canvas_obj = self.canvas.create_image(250, 250, image=tkimage)
答案 1 :(得分:0)
您似乎要求的是视频转换的2D世界:
选择“世界坐标”中定义的区域(比如10米乘10米) 并将其映射到画布坐标中定义的区域。
例如
from tkinter import *
xmin,ymin,xmax,ymax = 0,0,10,10 # world
umin,vmin,umax,vmax = 0,480,640,0 # viewport (note: y reversed)
points = [(2,2), (4,4), (7,7), (8,8)] # some "world" points
def world_to_viewport(worldpoint):
x,y = worldpoint
u = (x - xmin)*((umax - umin)/(xmax - xmin)) + umin
v = (y - ymin)*((vmax - vmin)/(ymax - ymin)) + vmin
return u,v
def pixel_to_world(pixel):
u,v = pixel
x = (u - umin)*((xmax - xmin)/(umax - umin)) + xmin
y = (v - vmin)*((ymax - ymin)/(vmax - vmin)) + ymin
return x,y
root = Tk()
canvas = Canvas(root, width=640, height=480, bd=0, highlightthickness=0)
canvas.pack()
def on_click(event):
root.title('%s,%s' %(pixel_to_world((event.x,event.y))))
canvas.bind('<ButtonPress-1>', on_click)
r = 5
for point in points:
cx,cy = world_to_viewport(point)
canvas.create_oval(cx-r,cy-r,cx+r,cy+r,fill='red')
root.mainloop()
答案 2 :(得分:0)
在我看来,使用如下代码可以很简单:
import Tkinter
#Set up a basic canvas
top = Tkinter.Tk()
canv = Tkinter.Canvas(top, bg="brown", height=250, width=300)
#Replace with what ever values you want
x = 50
y = 50
#Draw the first dot
line1 = canv.create_line(x, y, x - 2, y - 2, fill="green", width=3)
#This next line is pretty much all it takes to find the Y inverse
y = canv.winfo_reqheight() - y
#Draw the second dot
line2 = canv.create_line(x, y, x - 2, y - 2, fill="green", width = 3)
canv.pack()
top.mainloop()
返回以下内容:
基本上我所做的只是得到画布高度(250),并从中减去前一个Y值(50),返回Y反向(200)。不完全是内置功能,但实际的翻转部分非常简单。希望这就是你要找的......祝你好运!