Как устранить ошибку изображения Base64 при использовании Tkinter - PullRequest
2 голосов
/ 19 апреля 2019

Я бы хотел отобразить изображение base64 с помощью tkinter.Я использую Python 3 на ноутбуке Jupyter.

Я сделал следующее, основываясь на этом вопросе :

  1. Я импортирую изображение PNGи преобразовать его в формат base64

  2. Я пытаюсь открыть его с помощью 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>
    

Кто-нибудь знает, как это решить?

1 Ответ

2 голосов
/ 19 апреля 2019

Похоже, что вопрос, с которым вы связались, использует класс 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()
...