Pillow で…。
リードオンリーか…無念…。自己完結的にやりたかったのだがまぁ読めるのでいいと考えるかどうか…。
なんの話かって? なんでもいいんだけれど、「アイコンなどの自作「絵」のプログラムへの埋め込み」のアプローチの一つ、の話ね。今は Python の話なので、であれば「スクリプトファイルの中にブチ込みたい」て話ね、スクリプトとアイコンファイルを分けたくない/分けれない場合にどーすっか、てことだよ。
無論、基本的にはいつでも「base64などのテキストエンコードしちゃいなよ」で、あとは Pillow であれば frombytes だので。これでいいんだけれど、「XPM」ってね、唯一にして絶対的なメリットがあんのよ。これ、「テキストとして鑑賞しても絵」なのよわ。デカい絵には向かんけれど、16×16 くらいの絵なら「ちゃんとアスキーアート」なわけ、なのでスクリプトに埋め込んでも「読みやすい」。XBM ならねぇ、tobitmap でダイレクトに書き出し出来る。読み出しは こんな。ほぼ似たノリで XPM も読み出せる、ハズ。ただいかんせん、今「XPM を書き出せる子」を手持ってない、はず。持ってたかしらん? 持ってなかったと思われ、ゆえ、お試せない。…、まぁいいか。ちょっとやってみようと思っただけで、真剣にはなってない。
13:10追記:
うーん、そそっかしいというかなんというか。「唯一にして」がガセ。知らなかったんだけど、pbm なんぞも「アスキーアートにもなる」。pnm、ppm、pbm だのはワタシが丁度学生の頃に登場して、いっときちょっとだけブームにはなったんだけれど、いまどき誰ぞ使っておるんだかねぇ? それとも Unix 文化では今でも使ってるもん? そういや GMT なんかもそうなんだけれど、特定の学問領域だけで栄えて今でも延命してるものって結構あるんで、こいつらもそうだったるするのかもしらんなぁ。
翌01:10追記:
全然手付かずはやっぱちょっと悔しいのもあって見てたのだが、「リードオンリー」の中でもとりわけ悔やまれるタイプのリードオンリーかもしんない。これはダメなのよ:
1 from PIL import Image
2 xpmsrc = b"""\
3 /* XPM */
4 static char * sq_xpm[] = {
5 "8 8 2 1",
6 "* c #0000ff",
7 ". c #ffffff",
8 "..****..",
9 "..*..*..",
10 "********",
11 "*.*..*.*",
12 "*.*..*.*",
13 "********",
14 "..*..*..",
15 "..****..",
16 };
17 """
18 img = Image.frombytes("P", (8, 8), xpmsrc)
19 img.resize((8*10, 8*10)).save("sq.png")
Pillow がなんらか不平を言うことはないものの、正しく読めてない。けど、同じことを open で(つまりファイルを経由して)やればおけ:
1 import io
2 from PIL import Image
3 xpmsrc = b"""\
4 /* XPM */
5 static char * sq_xpm[] = {
6 "8 8 2 1",
7 "* c #0000ff",
8 ". c #ffffff",
9 "..****..",
10 "..*..*..",
11 "********",
12 "*.*..*.*",
13 "*.*..*.*",
14 "********",
15 "..*..*..",
16 "..****..",
17 };
18 """
19 io.open("hoge.xpm", "wb").write(xpmsrc)
20 img = Image.open("hoge.xpm")
21 img.resize((8*10, 8*10)).save("sq.png")
シームレスに綺麗に統合出来てないか、もしくは(ワタシが?)バイト/文字列の扱いをトチるなどのミスをしてるかのどっちかか? 「前者ならかなり残念だ」て話。無論「ファイル経由」は疑似ファイルでもよくて、なのでこれはおけ:
1 import io
2 from PIL import Image
3 xpmsrc = b"""\
4 /* XPM */
5 static char * sq_xpm[] = {
6 "8 8 2 1",
7 "* c #0000ff",
8 ". c #ffffff",
9 "..****..",
10 "..*..*..",
11 "********",
12 "*.*..*.*",
13 "*.*..*.*",
14 "********",
15 "..*..*..",
16 "..****..",
17 };
18 """
19 img = Image.open(io.BytesIO(xpmsrc))
20 mg.resize((8*10, 8*10)).save("sq.png")