1

私は次のことをしようとしています:

  1. imshow()matplotlib パッケージを使用してプロットを作成すると、matplotlib.image.AxesImage
  2. matplotlib.image.AxesImageに変換PIL.ImageTk.PhotoImage
  3. これPIL.ImageTk.PhotoImageを TkInter キャンバスの画像として使用する

画像を保存せずに上記を達成するにはどうすればよいですか?

投稿を参照した後、次のコードでデータを直接色分けしようとしました:

from Tkinter import *
from PIL import ImageTk,Image
import numpy as np
from pylab import cm
root=Tk()
canvas = Canvas(root)
canvas.pack(expand = YES, fill = BOTH)    
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
myarray = np.sin(x) + np.cos(y)
image1 = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))
test = canvas.create_image(10,10,image = image1)
#canvas.itemconfig(test, image=nextimage)    
mainloop()

上記のコードはエラーを返します

TclError: image "<PIL.Image.Image image mode=RGBA size=120x100 at 0x2DC01E8>" doesn't exist

何が問題なのですか?

4

1 に答える 1

1

インスタンスを作成して空にし、そこImageTk.PhotoImageにインスタンスのコンテンツを貼り付けるImage必要があります。

AxesImageオブジェクト ( によって返される)から読み取る場合は、まずimshowそのデータを に転送してから、 に貼り付けることができます。ImagePhotoImage

以下に例を示します (実際にはメッシュ グリッドで計算する必要があることに注意してくださいmyarray)。

from Tkinter import *
from PIL import Image, ImageTk
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
root=Tk()
canvas = Canvas(root)
canvas.pack(expand = YES, fill = BOTH)
x = np.linspace(0, 2*np.pi, 400)
y = np.linspace(0, 2*np.pi, 400)
X, Y = np.meshgrid(x, y, copy=False)
myarray = np.cos(X) + np.cos(Y)

im_plt = plt.imshow(myarray)

image1 = Image.fromarray(np.uint8( im_plt.get_cmap()(im_plt.get_array())*255))
im = ImageTk.PhotoImage('RGB', image1.size)
im.paste(image1)
test = canvas.create_image(0, 0, image=im)
mainloop()

次のような結果になります。

ここに画像の説明を入力

于 2013-08-31T14:24:06.093 に答える