我想使用tkinter显示base64图像。 我正在jupyter笔记本上运行python 3。
我已根据this question完成了以下操作:
我导入一个PNG图像并将其转换为base64格式
我尝试使用Tkinter打开它
import base64
with open("IMAGE.png", "rb") as image_file:
image_data_base64_encoded_string = base64.b64encode(image_file.read())
import tkinter as tk
from PIL import ImageTk, Image
root = tk.Tk()
im = ImageTk.PhotoImage(data=image_data_base64_encoded_string)
tk.Label(root, image=im).pack()
root.mainloop()
我得到了错误:
OSError Traceback (most recent call last)
<ipython-input-34-96dab6b5d11a> in <module>()
5 root = tk.Tk()
6
----> 7 im = ImageTk.PhotoImage(data=image_data_base64_encoded_string)
8
9 tk.Label(root, image=im).pack()
~\Anaconda3\lib\site-packages\PIL\ImageTk.py in __init__(self, image, size, **kw)
92 # Tk compatibility: file or data
93 if image is None:
---> 94 image = _get_image_from_kw(kw)
95
96 if hasattr(image, "mode") and hasattr(image, "size"):
~\Anaconda3\lib\site-packages\PIL\ImageTk.py in _get_image_from_kw(kw)
62 source = BytesIO(kw.pop("data"))
63 if source:
---> 64 return Image.open(source)
65
66
~\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode)
2655 warnings.warn(message)
2656 raise IOError("cannot identify image file %r"
-> 2657 % (filename if filename else fp))
2658
2659 #
OSError: cannot identify image file <_io.BytesIO object at 0x000001D476ACF8E0>
有人知道如何解决这个问题吗?
答案 0 :(得分:2)
您似乎链接到的问题使用tkinter.PhotoImage
类,该类与您的代码使用的PIL.ImageTk.PhotoImage
类具有不同的接口。后者接受普通的bytes
对象。您不需要先对其进行base64编码。
import base64
with open("IMAGE.png", "rb") as image_file:
image_data = image_file.read()
import tkinter as tk
from PIL import ImageTk, Image
root = tk.Tk()
im = ImageTk.PhotoImage(data=image_data)
tk.Label(root, image=im).pack()
root.mainloop()
或者,继续对数据进行base64编码,但是使用tkinter.PhotoImage
。
import base64
with open("IMAGE.png", "rb") as image_file:
image_data_base64_encoded_string = base64.b64encode(image_file.read())
import tkinter as tk
from PIL import Image
root = tk.Tk()
im = tk.PhotoImage(data=image_data_base64_encoded_string)
tk.Label(root, image=im).pack()
root.mainloop()