なのかなぁ? (xpm の話のちょい続き)

Pillow は xpm をリードオンリーでのみ扱える、てわけなのだが。

XpmImagePlugin.py は 1996-12-29 に作られてる。なのでたぶん Pillow ではなくオリジナルの PIL からあり、して、(唯一で)最終のアップデートとなる 2001-02-17 もきっと「PIL の歴史」だろう。そして今の今まで「save? なにそれ食べれんの?」を貫いてきたのは、無論「xpm そのものからして需要がそんなになかろ、ましてや save をや」てのが大きい、のではあろうけれども。

何かの機能を見送ったり先送りしたりする動機の一つって、やっぱし「実現容易性」に関係するんだけれど、果たして xpm のセーブはそうなのだろうか、て話をね。

実に「めっさ簡単」なわけよ、根本的な部分では、ただ一点を除けば。パレット定義の「表現の自由度」なんだよね、厄介なのは。以下二つは実に「PC くんと PC ちゃん」にとってはいたくアイデンティカルである:

其の壱。
 1 /* XPM */
 2 static char * cross_xpm[] = {
 3 "8 8 2 1",
 4 "# c #0000ff",
 5 "0 c #ffffff",
 6 "00####00",
 7 "00#00#00",
 8 "########",
 9 "#0#00#0#",
10 "#0#00#0#",
11 "########",
12 "00#00#00",
13 "00####00",
14 };
其の弐。アスキーアートとしての見栄えは違えど、出来上がるバイナリイメージは其の壱と完全に同一である。
 1 /* XPM */
 2 static char * cross_xpm[] = {
 3 "8 8 2 1",
 4 "* c #0000ff",
 5 ". c #ffffff",
 6 "..****..",
 7 "..*..*..",
 8 "********",
 9 "*.*..*.*",
10 "*.*..*.*",
11 "********",
12 "..*..*..",
13 "..****..",
14 };

この「アスキーアートとしてひとさまが読み書きしやすい」パレットを生成しようとすることそのものが、かなり難儀なんではないかと思うのだよね。簡単に機械的に決定できる方法は、ワタシは少なくとも知らない。Pillow が扱える XPM は最大で 256 色のパレットを使えるのだが、この 256 色をどのキャラクターに割り当てるのか、て話ね。この「自由度」をソフトウェアとしてユーザに自由にさせたい場合、関数やらのパラメータとして受け取る設計にすればいい、ちゃぁいいんだけれど、いかんせん、PIL/Pillow の「イメージプラグイン」の設計的にこの「自由」をコントロールさせるべきインターフェイスがない。

てことかなぁ?

このパレット定義問題を無頓着に適当にやるつもりなら、「XPM 作り子ちゃん」なんて、誰でも作れるよ。たぶん Python に慣れてる人で、Pillow を多少でも使ったことがある人なら、一時間以内に作れるハズ。慣れてる人はたぶん10分以内。パレット問題を度外視すれば、ね。

実際 XPM のライターが Pillow にいればねぇ…、ここでやってる banner も XPM で実現できるのだが…。


03:30追記:
「悔しいので」ベースドな。ここに、「テキストを xpm にしてみちゃいなよ君」の一例を追加しておいてみた。3色の例ね。

やってみてわかったんだが、「パレット定義」は「色変換」の問題を当然内包し、かつまた、「static char *」のあとの名前も自由なんだということもあって、最初に思ったよりは考えることが多いと思った。(C 言語を知っている人はすぐにわかることだが、xpm (や xbm)は C 言語として正当なテキストになっていて、実際そのまま C のプログラムの一部に出来るのだが、その「(C プログラムにおける)リテラル変数の名前」の話。上で例にしたもので「cross_xpm」としてる部分。)