LoginSignup
2
3

More than 3 years have passed since last update.

PyInstaller でicon 付きビルドをしようしてエラーになって困った件

Posted at

はじめに

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 だと透過も入るので、アイコンの見た目としてもよりよい。
  • この事象についての記事が全然見当たらなかったので、どこかの誰かのお役に立てれば幸い。
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3