4

简而言之,我想将 ImageTk.PhotoImage 对象转换为 Image (PIL) 对象或 numpy 数组。知道您可以使用 numpy.asarray() 将 Image (PIL) 对象转换为 numpy 数组。我得到了一个 numpy 数组,可以在 Tkinter 中显示它,例如:

 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 数组或“图像”的像素值)。也许我什至可以使用 ImageTk 在 Tkinter 中显示一个 numpy 数组或 Image (PIL) 对象,但我似乎也找不到答案。任何建议表示赞赏。谢谢!

4

1 回答 1

4

从 ImageTk 实例获取像素数据的效率非常低,您无法将 ImageTk 实例转换回 PIL 图像,但您可以简单地从原始 PIL 图像甚至带有坐标的数组中获取数据。

代替:

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

利用:

val=img.getpixel((x, y))
于 2012-04-21T02:28:09.690 回答