2021/07/09(金) [n年前の日記]
#1 [python][gimp][cg_tools] gpl2aco.pyを書いてみた
GIMPパレットファイル(.gpl)を、Photoshopスウォッチ(色見本)ファイル(.aco)に変換するツールを Python で書いてみたので一応アップロード。まあ…使う場面はほとんど無いのではないかと思うのだけど…。Windowsユーザなら、
_Cyotek Color Palette Editor
を導入すれば変換できるし…。
ソースは以下。
_gpl2aco.py - Convert GIMP palette (.gpl) to Photoshop color swatch (.aco) - gist
一応、ヘルプ表示も載せておきます。
ソースは以下。
_gpl2aco.py - Convert GIMP palette (.gpl) to Photoshop color swatch (.aco) - gist
- python gpl2aco.py hoge.gpl hoge.aco で変換できる。
- 色名は、英数字(ASCII)のみサポート。
- Windows10 x64 20H2 + Python 3.9.5 64bit上で動作確認。
一応、ヘルプ表示も載せておきます。
> python gpl2aco.py -h usage: gpl2aco.py [-h] [--nonull] gpl_file aco_file Convert GIMP palette (.gpl) to Photoshop color swatch (.aco) positional arguments: gpl_file Input GIMP palette file (.gpl) aco_file Output Photoshop swatch file (.aco) optional arguments: -h, --help show this help message and exit --nonull Exclude null from color name
◎ 問題点。 :
問題点その1。.aco を
_aco2gpl
を使って .gpl に変換して、その .gpl を、この gpl2aco.py で .aco に変換してみても、最初の .aco とは微妙にRGB値が違ってしまって元の内容には戻ってくれない。
これは、.aco が各RGB値を 0-65535 で記録していて、.gpl が各RGB値を 0-255 で記録しているから、ではないのかなと…。.aco から .gpl への変換は不可逆というか、情報が失われてしまうので、情報が失われてしまった .gpl から .aco を生成してみても元には戻らない、ということだと思う。
問題点その2。.aco にはバージョン1とバージョン2があって、バージョン2は各色の色名を含めることができるのだけど、色名の文字列の持ち方がツールによって異なるようで、どのフォーマットに合わせたらいいのかよく分からなかった。
_Adobe Photoshop File Formats Specification
上記の文書によると、各ファイルに格納される文字列は、最後に NULL (0x0000) がついて、文字数には NULL の分も含まれるらしいのだけど。ツールによっては、最後に NULL がつかず、文字数も NULL を含まない状態で出力されるものがあるようで。どちらのフォーマットのほうが正しいのか分からなかったので、オプション --nonull をつけると動作が変わるようにしておいた。
これは、.aco が各RGB値を 0-65535 で記録していて、.gpl が各RGB値を 0-255 で記録しているから、ではないのかなと…。.aco から .gpl への変換は不可逆というか、情報が失われてしまうので、情報が失われてしまった .gpl から .aco を生成してみても元には戻らない、ということだと思う。
問題点その2。.aco にはバージョン1とバージョン2があって、バージョン2は各色の色名を含めることができるのだけど、色名の文字列の持ち方がツールによって異なるようで、どのフォーマットに合わせたらいいのかよく分からなかった。
_Adobe Photoshop File Formats Specification
上記の文書によると、各ファイルに格納される文字列は、最後に NULL (0x0000) がついて、文字数には NULL の分も含まれるらしいのだけど。ツールによっては、最後に NULL がつかず、文字数も NULL を含まない状態で出力されるものがあるようで。どちらのフォーマットのほうが正しいのか分からなかったので、オプション --nonull をつけると動作が変わるようにしておいた。
- --nonull をつけなければ、文字列の最後に NULL がつく。デフォルトはこの動作。
- --nonull をつけると、文字列の最後に NULL がつかない。
◎ 余談。 :
一応メモ。Python でバイナリデータを生成するなら struct モジュールを使うと楽、らしい。例えば、struct.pack(">H", value) で、ビッグエンディアンの unsigned short を生成できたりする。
_7.1. struct - バイト列をパックされたバイナリデータとして解釈する - Python 3.6.13 ドキュメント
コマンドラインオプションの解析は argparse モジュールを使うと楽。
_ArgumentParserの使い方を簡単にまとめた - Qiita
docopt というものもあるらしい。ヘルプメッセージを書くだけでコマンドラインオプション解析の指定ができてしまう。素晴らしい。
_Python のコマンドライン引数ライブラリまとめ - Qiita
_Pythonistaなら知ってるオプションパーサ - Qiita
ただ、docopt は標準で入ってるわけではなくて、pip でインストールしないといけないようで…。
_7.1. struct - バイト列をパックされたバイナリデータとして解釈する - Python 3.6.13 ドキュメント
コマンドラインオプションの解析は argparse モジュールを使うと楽。
_ArgumentParserの使い方を簡単にまとめた - Qiita
docopt というものもあるらしい。ヘルプメッセージを書くだけでコマンドラインオプション解析の指定ができてしまう。素晴らしい。
_Python のコマンドライン引数ライブラリまとめ - Qiita
_Pythonistaなら知ってるオプションパーサ - Qiita
ただ、docopt は標準で入ってるわけではなくて、pip でインストールしないといけないようで…。
[ ツッコむ ]
以上です。