.exe形式のGUIでtifffileを使いたい
Tkinterを用いて、GUIの作成を行っています。
GUIの内容は「ボタンを押すと、cv2で読み込んだ画像を処理して、.tiff形式で保存する」というものです。
配布用にPyInstallerでコードを実行ファイル(.exe)化したところ、なぜかtifffileに関してのエラーが発生しました。
コードを直接コンソール画面に打ち込んでいるときには発生しなかったエラーです。
エラー内容について検索してみても、同じように困っている人が見つからなかったため、ここで質問します。
どなたかエラー解消方法にお心当たりのある方、ご回答よろしくお願いします。
発生している問題・エラーメッセージ
Exception in Tkinter callback Traceback (most recent call last): File "tkinter\__init__.py", line 1883, in __call__ File "sample.py", line 338, in btn_click storedata(t, tt, n, cap, TexName, TexNameT) File "sample.py", line 268, in storedata img2 = ti.imread(canny_path) File "tifffile\tifffile.py", line 712, in imread File "tifffile\tifffile.py", line 2651, in asarray File "tifffile\tifffile.py", line 5455, in asarray File "tifffile\tifffile.py", line 5320, in segments File "tifffile\tifffile.py", line 5309, in decode File "tifffile\tifffile.py", line 5038, in decode ValueError: TiffPage 0: <COMPRESSION.LZW: 5> requires the 'imagecodecs' package
正直、エラーの意味もよくわかっていません……。
該当のソースコード
python
1# sample.pyの中身 2import tkinter as tk 3from tkinter import filedialog, messagebox 4import cv2 5import tifffile as ti 6 7import os 8path = os.getcwd() 9 10root = tk.Tk() 11 12# 中略 13 14# 画像保存の関数 15def storedata(img_path, tt, n, cap, TexName, TexNameT): 16 img = cv2.imread(img_path) 17 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 18 canny = cv2.Canny(gray, 200, 400) 19 cv2.imwrite(canny_path, canny) 20# .tiff形式に変換。cv2.imwriteで.tiff形式にすると、表示時にエラーが発生する 21 img2 = ti.imread(canny_path) # <- エラー該当部分 22 ti.imsave(canny_path, img2) 23 # 中略 24 messagebox.showinfo("確認", "完了しました。") 25 26 27# ボタンクリック時の関数 28def btn_click(): 29 t = filedialog.askdiretory(initialdir=path, title="選択") 30# 中略 31# 関数呼び出し 32 storedata(t, tt, n, cap, TexName, TexNameT) # <- エラー該当部分 33# t以外の変数はstoredata関数内で別の処理を行うために渡すもの。今回は省略 34 35btn = ttk.Button(text="sample", command=btn_click) 36btn.pack() 37 38 39root.mainlop()
実行してみると、cv2で保存した.tiffファイルのみが保存されており、そのあとの処理で行ったtifffileによる保存が行われていない状況でした。
その時点でエラーが出て処理が止まっているようで、メッセージボックスも表示されませんでした。
.specファイル
PyInstallerの際に用いた.specファイルの中身です。
python
1# -*- mode: python ; coding: utf-8 -*- 2 3block_cipher = None 4 5import sys 6myLib = r"C:\~~~\anaconda3\Lib" 7myPkg = r"C:\~~~\anaconda3\envs\sample\Lib\site-packages" 8sys.path.append(myLib) 9sys.path.append(myPkg) 10 11 12a = Analysis(['sample.py'], 13 pathex=['C:\~~~\anaconda3'], 14 binaries=[], 15 datas=[], 16 hiddenimports=["pkg_resources.py2_warn", "pkg_resources.markers"], 17 hookspath=[], 18 runtime_hooks=[], 19 excludes=[], 20 win_no_prefer_redirects=False, 21 win_private_assemblies=False, 22 cipher=block_cipher, 23 noarchive=False) 24a.datas += [('AppIcon.ico', '.\AppIcon.ico', 'DATA')] 25pyz = PYZ(a.pure, a.zipped_data, 26 cipher=block_cipher) 27exe = EXE(pyz, 28 a.scripts, 29 a.binaries, 30 a.zipfiles, 31 a.datas, 32 [], 33 name='sample', 34 debug=False, 35 bootloader_ignore_signals=False, 36 strip=False, 37 upx=True, 38 upx_exclude=[], 39 runtime_tmpdir=None, 40 console=False, icon='AppIcon.ico') 41app = BUNDLE(exe, 42 name='sample.app', 43 icon='AppIcon.ico') 44coll = COLLECT(exe, 45 a.binaries, 46 a.zipfiles, 47 a.datas, 48 strip=False, 49 upx=True, 50 name='sample')
追記・試したこととエラー変更
「imagecodecsがありません」と言われているのはなんとなく分かったため、imagecodecsライブラリをインストールしてみました。
すると、エラー内容が下のようになりました。エラー箇所は恐らく同じです。
python
1DelayedImportError: could not import name 'lzw_decode' from 'imagecodecs'
「lzw_decodeがインポートできませんでした」と言われたため、sample.exeの元となるsample.py内で、
python
1from imagecodecs import lzw_decode
のコードを追加し、再度PyInstallerで.exe化しました。すると、エラーの内容が以下に変わりました。
python
1Traceback (most recent call last): 2 File "sample.py", line 286, in storedata 3 File "tifffile\tifffile.py", line 712, in imread 4 File "tifffile\tifffile.py", line 2651, in asarray 5 File "tifffile\tifffile.py", line 5455, in asarray 6 File "tifffile\tifffile.py", line 5320, in segments 7 File "tifffile\tifffile.py", line 5309, in decode 8 File "tifffile\tifffile.py", line 5270, in decode 9 File "imagecodecs\imagecodecs.py", line 459, in stub_decode 10imagecodecs.imagecodecs.DelayedImportError: could not import name 'lzw_decode' from 'imagecodecs'
流石に数千行ある内容すべてを転写するのは長すぎるため、↑のtifffile.pyと、imagecodecs.pyのエラー箇所を抜粋します。
python
1# tifffile.py 2 3# line 712 4return tif.asarray(**kwargs) 5# line 2651 6result = pages[0].asarray(out=out, maxworkers=maxworkers) 7# line 5455 8for in self.segments( 9 func=func, lock=lock, maxworkers=maxworkers, sort=True 10# line 5320 11yield decode(segments) 12# line 5309 13result = keyframe.decode(*args, **decodeargs) 14# line 5270 15data = decompress(data, out=size * dtype.itemsize)
python
1# imagecodecs.py 2 3# line 459 4if name.endswith('_decode'): 5 def stub_decode(*args, **kwargs): 6 f"""Stub for imagecodecs.{name}.""" 7 raise DelayedImportError(name) # <-- line 459
かなりマイナーなエラーで、非常に困っています。
解消方法にお心当たりのある方、是非よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Windows10
Python 3.8.3
OpenCV 4.4.0.40
tifffile 2020.8.13
PyInstaller 4.0
imagecodecs 2020.5.30
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/18 07:05
2020/08/18 07:25
2020/08/18 07:36
2020/08/18 10:48
2020/08/18 17:49 編集
2020/08/19 01:20
2020/08/19 11:17
2021/12/05 20:48