2012-04-21 120 views
4

总之,我想将ImageTk.PhotoImage对象转换为Image(PIL)对象或numpy数组。知道你可以使用numpy.asarray()将Image(PIL)对象转换为numpy数组。我给一个numpy的阵列,可以在Tkinter的喜欢它显示:Tkinter图像显示(带有[转换] NumPy数组)

from Tkinter import * 
import numpy as np 
import Image, ImageTk 

def callback(event): 
     # do some stuff with a numpy array 
     # ideally, e.g.: 
     x=event.x; y=event.y 
     val=np.asarray(imgTk)[x,y] 
     print val 

arr=np.ones([256,256]) 
img=Image.fromarray(arr) 
imgTk=ImageTk.PhotoImage(img) 

t=Tk() 
l=Label(t) 
l.configure(image=imgTk) 
l.bind('<Motion>', callback) 

l.pack() 
t.mainloop() 

但部分

np.asarray(imgTk) 

不返回[256,256]数组喜欢我的预期。可能有一个更简单的方法来解决这个问题(正如你所看到的,我试图打印出2D numpy数组的像素值,或者当我将光标移动到它上面时,“图像”)。也许我甚至可以在Tkinter中使用ImageTk显示一个numpy数组或图像(PIL)对象,但我似乎无法找到答案。任何建议感激。谢谢!

+0

那你知道该怎么做相反?至于如何将numpy数组图像转换为Tk图像,以便我可以使用Tkinter显示它? – 2014-02-25 06:06:42

回答

4

从ImageTk实例获取像素数据的效率非常低,您无法将ImageTk实例转换回PIL图像,但您可以简单地从原始PIL图像或甚至包含阵列中获取数据。

相反的:

val=np.asarray(imgTk)[x,y] 

用途:

val=img.getpixel((x, y)) 
+0

作品。你太客气了,先生/女士。谢谢! – Ryan 2012-04-21 02:36:54