3
PILのImageDrawモジュールを使用して個々のピクセル操作を実行しようとしています。コードはTkinterのキャンバスウィジェットを作成することになっています。その後、画像を開き、1つのピクセルの色を赤に変更して、その画像をキャンバスウィジェットに埋め込みます。しかし、それは動作していないようです。PILのImageDrawモジュールの使用
マイコード:
import Tkinter
from PIL import ImageTk, Image, ImageDraw
class image_manip(Tkinter.Tk):
def __init__(self):
Tkinter.Tk.__init__(self)
self.configure(bg='red')
self.ImbImage = Tkinter.Canvas(self, highlightthickness=0, bd=0, bg='blue')
self.ImbImage.pack()
im = Image.open(r'C:\Python26\Suite\test.png')
print im.format, im.size, im.mode
im = ImageDraw.Draw(im)
im = im.point((0, 0), fill="red")
self.i = ImageTk.PhotoImage(im)
self.ImbImage.create_image(139, 59, image=self.i)
def run():
image_manip().mainloop()
if __name__ == "__main__":
run()
私は私のコードを実行すると、次のエラーを取得:
Exception AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage instance at 0x05DF7698>> ignored
Traceback (most recent call last):
File "<string>", line 245, in run_nodebug
File "C:\Python26\Suite\test_image.py", line 30, in <module>
run()
File "C:\Python26\Suite\test_image.py", line 28, in run
image_manip().mainloop()
File "C:\Python26\Suite\test_image.py", line 20, in __init__
self.i = ImageTk.PhotoImage(im)
File "C:\Python26\lib\site-packages\PIL\ImageTk.py", line 109, in __init__
mode = Image.getmodebase(mode)
File "C:\Python26\lib\site-packages\PIL\Image.py", line 245, in getmodebase
return ImageMode.getmode(mode).basemode
File "C:\Python26\lib\site-packages\PIL\ImageMode.py", line 50, in getmode
return _modes[mode]
KeyError: None
感謝を呼び出すときに
draw
変数を削除します。 – rectangletangleImageTk.PhotoImage(im)を*永続*(ガベージコレクションされていない)変数に割り当てる必要があることに注意してください。 Tkinterにはバグがあります。バグはローカル変数に割り当ててcreate_imageで使用するだけでガベージコレクションされます。 http://infohost.nmt.edu/tcc/help/pubs/pil/image-tk.htmlを参照してください。 – mckoss