はじめに
PyInstaller でicon 付けてビルドしようとするとWindows10環境ではエラーになる場合があって困りましたが、解決できたのでまとめておきます。
起きたこと と 解決方法
実行環境
- OS : Windows 10 64bit
- Python : 3.9.2
- PyInstaller : 4.1
エラー内容
下記のようにビルド
$ pyinstaller --onefile --icon=sample.ico hogehoge.py
そしたらこんなエラーメッセージが。。。
そして *.exe が生成されない(アイコンなく生成されるのではなく、そもそも生成されない)。
> struct.error: unpack requires a buffer of 16 bytes
試しに、macOS(Big Sur)の環境で確認してみると、こちらは何事もなく普通にビルドできた。
原因
- このとき指定していた画像(
sample.ico
)は、色深度が24bit のファイルだった。
(正確には色深度24bit の PNGファイルから ICO ファイルを作成した画像) - つまり、指定するICOファイルの色深度が24bit だとエラーになる。
- Windows環境のみ。macOS では普通にビルドできた。
解決方法
- アイコン設定したい画像のicoファイルを色深度32bit で作成し、それを指定する。
もう少し詳しく
PyInstaller とは
- PythonスクリプトをPythonがインストールされていない環境でも利用できるように配布用の実行ファイル(*.exe)に固めてくれる便利なやつ。
Python 環境を整えていない人に使ってもらいたいときなどに重宝する。 - 配布用の実行ファイルにアイコンを付けることができる。
ビルドオプションなどは下記マニュアル参照
https://pyinstaller.readthedocs.io/en/stable/usage.html
色深度(ビット深度)とはなにか?
- その画像形式が扱えるデータ量のこと
- Windows10 のファイルプロパティで確認したときに「ビットの深さ」と表示されるもの。
色深度の違い
色深度(ビット深度) | 扱える色 |
---|---|
24bit | 約1,677万色 |
32bit | 約1,677万色 + 8bitの透過 |
透過できるかどうかの違い
今回の問題
- 色深度24bit のPNG で作成された *.icon ファイルを指定してビルドしようとしていたためにエラーになった。
- macOS では普通にビルドできたため、わかりにくかった。
ビルド可否
OS | 24bit icon | 32bit icon |
---|---|---|
Windows10 | × | ○ |
macOS Big Sur | ○ | ○ |
まとめ
- PyInstaller でアイコンを設定するときには、色深度 32bit のPNG で作成した *.icon ファイルを指定してビルドしましょう。
- 32bit だと透過も入るので、アイコンの見た目としてもよりよい。
- この事象についての記事が全然見当たらなかったので、どこかの誰かのお役に立てれば幸い。