首頁 > 軟體

python的ImageTk.PhotoImage大坑及解決

2022-12-01 14:02:08

python的ImageTk.PhotoImage大坑

如果大家遇到這樣的報錯:

Exception in Tkinter callback
Traceback (most recent call last):
  File "E:Anaconda3_fileslibsite-packagesPILImage.py", line 2515, in fromarray
    mode, rawmode = _fromarray_typemap[typekey]
KeyError: ((1, 1, 3), '<f8')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:Anaconda3_fileslibtkinter__init__.py", line 1705, in __call__
    return self.func(*args)
  File "D:Junior SpringDigital Image Processing and Experiment數位實驗備份結課實驗ImgProcessing.py", line 806, in Sobel_Sharpening
    image = ImageTk.PhotoImage(Image.fromarray(img))
  File "E:Anaconda3_fileslibsite-packagesPILImage.py", line 2517, in fromarray
    raise TypeError("Cannot handle this data type")
TypeError: Cannot handle this data type

網上很多教學的方法我也試過,沒有用,也偵錯不出為什麼

這裡有個很關鍵的資訊:Cannot handle this data type

說明是資料的型別錯了,但再三檢查後,明明就是帶入的<class ‘numpy.ndarray’>型別

所以,大坑來了

請仔細檢查自己array裡面每個數的型別,它必須是<class ‘numpy.uint8’>,否則就會報錯

可以這樣改:

dst = dst.astype(np.uint8)
image = ImageTk.PhotoImage(Image.fromarray(dst))

Tkinter PhotoImage 踩坑記錄

1.直接使用PhotoImage(file= ‘xxxx’)報錯:_tkinter.TclError: couldn’t recognize data in image file “xxxxx.png”

原因:PhotoImage支援的圖片格式有限。

解決辦法:使用PILLOW庫的ImageTk

  • 1.如果沒有安裝PILLOW外掛,請安裝外掛,使用 “pip install PILLOW”命令安裝即可
  • 2.生成PhotoImage物件:

程式碼:

from PIL import Image

from PIL import ImageTk

img = Image.open(filePath)

img = ImageTk.PhotoImage(img)

2.PhotoImage顯示問題:顯示空白框,大小是圖片的真實大小

原因:見https://docs.Python.org/2/library/tkinter.html#images,說白了就是影象資料參照被回收了圖片就顯示不出來了,只會顯示一個空box。

解決辦法:儲存PhotoImage物件即可,範例程式碼如下:

程式碼:

imgDict = {}
def getImgWidget(filePath):

    if os.path.exists(filePath) and os.path.isfile(filePath):

        if filePath in imgDict and imgDict[filePath]:

            return imgDict[filePath]

        img = Image.open(filePath)

        #print(img.size)

        img = ImageTk.PhotoImage(img)

        imgDict[filePath] = img

        return img

    return None

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com