私はLineage冒険記中の OE戦績にて、いくつかゲーム画面のSSを使用しています。 このゲームのスクリーンショット(以下、SS)は、TGAと呼ばれる フォーマットで出力されます。
さて、SSを撮っても、その中の1行のメッセージを見せるためだけに 馬鹿でかい1枚絵をそのまま載せる訳にはいきません。切り抜きや、場合によってはぼかしなどを 行うために、加工ツールが必要となります。私はこういった用途に GIMPを使っています。このソフトはプラグインで動作を拡張できます。 というか、本当に基本的な枠組み以外は、画像の入出力から加工ツールまでほとんどプラグインで構成されていまして、 標準で、かなり多くのプラグインが入っています。 (あと、強力なスクリプト機能等が特徴ですが、ここの話には関係ないので割愛します)
そして、GIMPにはTGAフォーマット用のプラグインも あります。が、GIMP-1.2.4でLineageのSSを読み込ませても、 まともに表示してくれません (リンク先の画像の市松模様は透過を分かりやすくするための背景ね)。 画像自体の横幅はそのままで、絵柄の部分の横幅が4/3ほどになって左に寄せられ、残りは無色透明。 さらに絵柄の部分まで不規則に透けているという不思議画像になってしまうのです。 チャンネル分解して、透過情報をグレースケール画像として取り出すと、これまた同じような絵になっていたり。
はじめのうちは別のツール(こっちには編集機能がない)を用いてWindowsビットマップファイルに変換してから それを加工するということをやっていましたが、やがて忍耐の限界に。
かといって、Adobe PhotoShopなんか買う金なんぞないし。
で、これはプラグインのバグっぽいので、できることなら直して使ってやろうと このプラグインのソースファイルを読みました。 GIMPはGPL2 というライセンスで配布されているので、ソース読み放題、改変し放題なんです。(まあ、厳格なライセンスなんで、 こう乱暴に書くといろいろ語弊もあったりしますが)
結果、分かったこと。
ちなみに、TGAと一口に言っても いろいろとありますが、ここでは無圧縮、カラーマップなしのフォーマットについて述べています。 他の種類については手が回りませんでした。
さて、問題です。アルファチャネルありの16ビットTGAを 読み込もうとするとどうなるでしょうか?
答:1ピクセル32ビットで用意されているのに、書き込み位置が24ビットずつしか移動していかないため、 横幅いっぱいには画像が描かれない。また、本来アルファチャネルになるはずのところに割とランダムな 色データが書き込まれるため、透過度がなかなか不思議なものとなる。
はい、先に説明した通りの変な画像になっちゃうわけですね。
原因がわかったのでソースを書き直してコンパイル。すると きちんと表示されました。
興味ある人のために、パッチを置いておきます。
<ぼそ>実はこのパッチにも疑問が残っていることは内緒だ。</ぼそ>