GIMPのカラーパレット(gpl)をFire Alpaca向けに変換したい

さて、実際の変換に必要になったのは以下の3つでした。

  • Python
  • yt様のPythonスクリプト
  • 変換元となるGIMP用パレットファイル (.gpl)

まずは、スクリプトが動作する環境がないと駄目なので
MicrosoftストアでPythonの環境を落としてきます。

Python、と検索して一番上に出てくるやつでOKです
(記事執筆時の最新版は3.9)

インストールすれば、コマンドプロンプト経由で
Pythonスクリプトを走らせられるようになります。


yt様のスクリプトと拾ってきたGPLファイルをデスクトップに置いて、


コマンドプロンプトを起動。

作業ディレクトリであるデスクトップに移動しなければいけないので、
コマンドラインではお馴染み、cdコマンドを使って
デスクトップまで移動します。

C:\Users\(ユーザ名)>cd desktop
C:\Users\(ユーザ名)\Desktop>

二行目、ユーザ名の次がDesktopに変わったので、
無事にデスクトップに移動することができました。


次にスクリプトの名前を書いてあげるのですが、
Pythonだよ~ってことをコマンドプロンプトに
分からせてあげないとだめなので、

先頭に“Python”と記述して、スペースを開けた上
”gpl2ini.py”の名前を書きます。

C:\Users\(ユーザ名)\Desktop>Python gpl2ini.py

続いて、スクリプトが作業をする材料として、
引数を渡してあげなければいけません。

ここでの引数は、

  • 入力するパレットファイルの名前.gpl
  • 完成したパレットファイルの名前.ini

の2つとなります。

仮に、作業元のパレットファイルの名前が ”GIMP_PALETTE.gpl”
完成したファイルの名前を ”Palette.ini” にしたい場合、
コマンドラインには以下のように記述します。

C:\Users\(ユーザ名)\Desktop>Python gpl2ini.py GIMP_PALETTE.gpl Palette.ini

これでEnterを押せば変換の作業が始まって
完成したパレットが新たにデスクトップに現れるはずなのですが、
この状態だとエラーを吐いてしまってうまくいきません。

というのも・・・
このスクリプトが書かれたのは2014年。
当時のPythonバージョンは2でした。

バージョン2から3に変わるタイミングで
コードの書き方が変わってしまったので、
古いスクリプトが動かなくなってしまったということなんです。

注:ここからはPythonはおろかプログラミング言語を
  殆ど触ったことのない人間の説明になるので
  プログラミングができる方は目から血を出す覚悟をするか
  エラー見てご自身でプログラム書き直したほうがいいと思います。


  人さまのスクリプトを勝手に掲載するわけにも行かないので、
  ご自身でダウンロードしたスクリプトを手元に用意して
  それを見ながら記事を追っていただけたらと思います。

このスクリプトがPython 3でも動作するようにするためには、
14と40行目、そして34~36行目を修正してあげる必要があります。

まずは14行目。

入力した一番目の引数(GIMPパレット)を
gplという変数に代入した上で、
中身をこねこねするために新たな変数gpl_sを起こして
ファイルを読み込む処理がなされてるっぽいです。多分。
(めっちゃ早口で言ってそう)


ここでは、読み込みのために file() というメソッドが使われています。

この部分が file() メソッドのままだと、Python 3で走らせた場合に
バッチリ引っかかってエラーになっちゃうので、
ここでは代わりのメソッドとして open() を使います。

14行目 file(gpl)~~ と、40行目file(ini, “w”)~~ を
それぞれ open(gpl) open(ini, “w”)という形に書き換えてあげてください。

これでファイルの読み書きができるようになりました。多分。

そして、29行目から始まるfor文では、
GIMPのパレットから引き出した色のデータを、
アルパカちゃんが読める以下のフォーマット:

[0]
name=---
r=@Variant(\0\0\0\x86\xなんちゃら)
g=@Variant(\0\0\0\x86\xかんちゃら)
b=@Variant(\0\0\0\x86\xうんちゃら)

に書き換える処理が書かれています。


コード的には問題ないのですが、
文字コードがちょい変な感じになっちゃってます。

SSAってなにンゴ

なぜかは分かりませんが、少なくとも僕の環境でDLしたスクリプトは
全部この状態になってました。

このSSAってなんだろうと思って調べてみたら、
Unicode文字の START OF SELECTED AREA だということがわかりました。

この文字をUTF-8の書類の中で使う場合、0xC2 0x86 って書くんですって。


ここでアルパカのパレットの書式を見てみましょう。

[0]
name=---
r=@Variant(\0\0\0\x86\xなんちゃら)
g=@Variant(\0\0\0\x86\xかんちゃら)
b=@Variant(\0\0\0\x86\xうんちゃら)


なんか近ぇのがいるんだわ。三人も。

スクリプトの文字コードはUTF-8。きっとどこかで何かしらが
ごっちゃになっちゃったんでしょうね…

ここでは、()で囲まれた部分を、以下のようにする必要があります。
\\0\\0\\0\\x86%s

これで、コードがPython 3.x上でも動作するようになったはずです。

ちなみに、\ (バックスラッシュ)が2連続で使われているのには訳があります。
Pythonでは特殊文字を「バックスラッシュ+文字」という形で表現することがあり、
例えば文字列を改行するのに「\n」という記述が使われます。

これをエスケープシーケンスといいます。

バックスラッシュはこの機能のために予約されちゃってる状態になるので、
本当にバックスラッシュだけがほしいときは、
エスケープシーケンス用のバックスラッシュに加えて、文字としての
バックスラッシュが必要になるのです。

また一つ賢くなってしまった。
思えばスクリプトが変になったのってx86の直前のバックスラッシュが
一つ足りなかったせいとか・・・?

次ページに続きます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です