Tkinter错误:无法识别图像文件中的数据

Igo*_*234 10 python macos canvas tkinter python-3.x

我正在尝试将jpg图像放到tkinter画布上。tkinter给我这个错误:

无法识别图像文件中的数据

我使用文档中的代码:

canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)

img = PhotoImage(file="bll.jpg")
canv.create_image(20,20, anchor=NW, image=img)
Run Code Online (Sandbox Code Playgroud)

png图像也是如此。甚至试图将图像放入标签小部件中,但出现相同的错误。怎么了?

我在Mac上使用Python 3。Python文件和图像位于同一文件夹中。

bas*_*flp 8

您的代码似乎正确,这在Windows 7(Python 3.6)上为我运行:

from tkinter import *
root = Tk()

canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)

img = PhotoImage(file="bll.jpg")
canv.create_image(20,20, anchor=NW, image=img)

mainloop()
Run Code Online (Sandbox Code Playgroud)

导致此tkinter GUI:

图形用户界面该图像为bll.jpg图片

(imgur将其转换为,bll.png但这也对我有用。)


更多的选择:

  • 这个答案提到,tkinter仅适用于gif图像。尝试使用.gif图像。
  • 如果这不起作用,请PIL按照此答案中的说明使用。

更新:解决方案PIL

from tkinter import *
from PIL import ImageTk, Image
root = Tk()

canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)

img = ImageTk.PhotoImage(Image.open("bll.jpg"))  # PIL solution
canv.create_image(20, 20, anchor=NW, image=img)

mainloop()
Run Code Online (Sandbox Code Playgroud)


SF1*_*udy 7

安装 PIL/Pillow:

pip install Pillow
Run Code Online (Sandbox Code Playgroud)

或者:

sudo pip install pillow
Run Code Online (Sandbox Code Playgroud)
from PIL import Image
from PIL import ImageTk
import tkinter

image = Image.open('bll.jpg')
image = image.resize((20, 20))
image = ImageTk.PhotoImage(image)

canv = Canvas(root, width=80, height=80, bg='white')
canv.grid(row=2, column=3)

img = PhotoImage(file=image)
Run Code Online (Sandbox Code Playgroud)

同样使用 .PNG 而不是 .JPG 更适合 Tkinter。


Atl*_*435 7

直接回答原来的问题:Tkinter 目前不支持 JPG 图像,PNG 支持取决于系统的 Tcl/Tk 版本 - 一个单独的库,用 C 编写,Python 通过 Tkinter 与之交互(因此“inter”部分)。流行的第三方库pillow提供了 Tkinter 类的直接替代品PhotoImage,使其能够支持更多图像格式。

Tkinter 支持的图像格式

Tcl /Tk 手册描述了对两种独立图像类型的支持 -bitmap并且photo- 如此描述:

位图是一种图像,其像素可以显示两种颜色或透明。

照片是像素可以显示任何颜色或透明的图像。照片图像以全色(每像素 32 位)内部存储,并在必要时使用抖动显示。

这些在 Tkinter 中分别反映为BitmapImagePhotoImage类。Tkinter 支持的格式稍微取决于安装的 Tcl/Tk版本。然而,从 3.10 开始,Tcl/Tk 8.6 的线程构建包含在官方 Python 二进制版本中

Python Tkinter 文档主要侧重于解释 Tkinter 在 Tcl/Tk 之上添加的功能。对于大多数事情,用户应该参考 Tcl/Tk 文档(或第三方来源;Python 文档提供了一些建议)并了解界面的一般工作方式

正如Donal Fellows 在另一个 Stack Overflow 问题上指出的那样,Tcl/Tk 无法处理超过 2GB 的单独内存分配,这在理论上限制了图像大小。

图图像

Tcl/Tkbitmap比 s 受到更多限制photo,因此实际上来说,PhotoImage会更频繁地使用。但为了完整性:BitmapImage支持 BMP (跨平台)、XPM(用于像素图/彩色位图,主要在 X11 上)和 ICO 格式(ICO 是一种主要用于 Windows 图标的特殊位图)。

照片图像

如 Tcl/Tk 文档中所述,photo可以从包含原始图像数据的数据字符串创建 a:

该字符串应包含二进制数据,或者对于某些格式,包含 base64 编码的数据(目前保证 PNG 和 GIF 图像支持)。

PhotoImage无论 Tcl/Tk 版本如何,都支持GIFPPMPGM图像。

需要Tcl/Tk 版本 8.4来支持透明度。(但是,由于 8.3 分支自 2002 年以来就不再维护,因此实际上可以保证当前支持 Tkinter 的 Python 安装将具有透明度支持。)

Tcl/Tk 版本 8.6添加了对 PNG 图像的支持。如果可能,将对图像进行伽玛校正:

此外,实现应该...允许通过 结合gAMA导入图像块(如果存在)应用显示伽玛(如果已知) -format "png -gamma value"

Tcl/Tk 8.7(目前处于 alpha 版本)中计划 支持 SVG (有一些限制)。如果版权问题能够得到解决,将来可能会包含 JPEG 支持。

此外,还有几种方法可以扩展默认库支持:

验证图像格式

Stack Overflow 上询问的 Tkinter 图像支持的许多其他问题最终都是由图像引起的,很简单,图像的格式不是程序员期望的。请注意,如果 Tkinter 尚不支持图像格式,则简单地将文件重命名为具有适当的后缀将无济于事。后缀只是提示文件中包含哪些数据。(底层 Tcl/Tk 库还允许显式指定格式,但主要是从后缀和/或数据本身推导出来的。)

以下是验证图像格式的一些方法:

  • 使用图像编辑程序打开它。(无论如何,以指定格式重新保存图像是解决不受支持的格式问题的最简单方法,因此这通常是最实用的方法。)

  • 使用命令行工具,例如fileLinux上的命令。

  • 以编程方式打开文件并检查前几个字节,例如使用第三方文件类型包。

  • 只需使用异常处理 ( try/ except) 并在不支持所需图像时回退到占位符图像。(无论如何,这可能是必要的,例如图像损坏或丢失。)


小智 6

我遇到了同样的问题。我有Windows和Python 3.6。因此,我为此找到了两种解决方案:使用/转换为.png图像(具有与您使用的相同功能):

photo = PhotoImage('xyz.png')
l = Label(image = photo)
l.pack()
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想读取.jpg文件,则使用PIL库读取和显示如下图像:

from PIL import ImageTk, Image
img = ImageTk.PhotoImage(Image.open("xyz.jpg"))  
l=Label(image=img)
l.pack()
Run Code Online (Sandbox Code Playgroud)