2013-08-22 52 views
7

我似乎无法让我的PIL图像在画布上工作。代码:如何在画布上打开Tkinter中的PIL图像

from Tkinter import* 
import Image, ImageTk 
root = Tk() 
root.geometry('1000x1000') 
canvas = Canvas(root,width=999,height=999) 
canvas.pack() 
image = ImageTk.PhotoImage("ball.gif") 
imagesprite = canvas.create_image(400,400,image=image) 
root.mainloop() 

错误:

Traceback (most recent call last): 
    File "C:/Users/Mark Malkin/Desktop/3d Graphics Testing/afdds.py", line 7, in <module> 
    image = ImageTk.PhotoImage("ball.gif") 
    File "C:\Python27\lib\site-packages\PIL\ImageTk.py", line 109, in __init__ 
    mode = Image.getmodebase(mode) 
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 245, in getmodebase 
    return ImageMode.getmode(mode).basemode 
    File "C:\Python27\lib\site-packages\PIL\ImageMode.py", line 50, in getmode 
    return _modes[mode] 
KeyError: 'ball.gif' 

我需要使用PIL图像不PhotoImages因为我想调整我的图片。请不要建议切换到Pygame,因为我想使用Tkinter。

+1

我很困惑 - 你说你不想使用'PhotoImage's,但你的代码使用'PhotoImage'。你的意思是你想使用'ImageTk.PhotoImage'而不是'Tkinter.PhotoImage'? – Brionius

+1

你有没有试过阅读'PhotoImage'的文档?它需要一个图像对象,或者一个模式和一个尺寸。你也没有通过它;你传递一个文件名。 ('return _modes [mode]'上的'KeyError'很明显它试图将文件名视为一种模式...但是尝试使用哪一个并不重要,它会以任何方式失败。) – abarnert

回答

8

先尝试创建一个PIL图像,然后使用它来创建PhotoImage。

from Tkinter import * 
import Image, ImageTk 
root = Tk() 
root.geometry('1000x1000') 
canvas = Canvas(root,width=999,height=999) 
canvas.pack() 
pilImage = Image.open("ball.gif") 
image = ImageTk.PhotoImage(pilImage) 
imagesprite = canvas.create_image(400,400,image=image) 
root.mainloop() 
+0

ImageTk.PhotoImage是我想用的,因为我想成为一个能够调整大小的东西。 – user164814

+0

raise ImportError(“_imaging C模块没有安装”) ImportError:_imaging C模块没有安装 – user164814

+0

@ user164814啊,你在那里玩得很开心。你错过了PIL二进制文件 - 这是PIL安装的问题,而不是代码。请参阅[本文](http://effbot.org/zone/pil-imaging-not-installed.htm)。如果您使用MacPorts安装PIL,请尝试自己安装系统版本。祝你好运。 – Brionius

2

您可以导入多种图像格式,并使用此代码调整大小。 “底宽”设置图像的宽度。

from Tkinter import * 
import PIL 
from PIL import ImageTk, Image 

root=Tk() 
image = Image.open("/path/to/your/image.jpg") 
canvas=Canvas(root, height=200, width=200) 
basewidth = 150 
wpercent = (basewidth/float(image.size[0])) 
hsize = int((float(image.size[1]) * float(wpercent))) 
image = image.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 
photo = ImageTk.PhotoImage(image) 
item4 = canvas.create_image(100, 80, image=photo) 

canvas.pack(side = TOP, expand=True, fill=BOTH) 
root.mainloop() 
0

(一个老问题,但答案迄今只完成了一半)

阅读文档:

class PIL.ImageTk.PhotoImage(image=None, size=None, **kw) 
  • image - 无论是PIL图像,或模式字符串。 [...]
  • file - 从(使用Image.open(file))加载图像的文件名。

所以,在你的榜样,用

image = ImageTk.PhotoImage(file="ball.gif") 

或明确

image = ImageTk.PhotoImage(Image("ball.gif")) 

(请记住 - 因为你做了正确的:保持在你的Python程序中的图像对象的引用,否则它是垃圾收集之前,你seee)。

相关问题