2007/04/23(月) [n年前の日記]
#2 [iappli] Palette の使い方がさっぱりわからん。
エミュレータ上では意図通りの表示になってるように見えるのだが。実機で動かすと変な色になる。うーん。
エミュレータ上でのトレース情報。
P902iS上でのトレース情報。
値の関連性がまったく見えてこない。機種依存の値を返すのであろうか。となると、ロードした画像のパレットを読んで、計算で変化させて、なんて処理は無理ということに…。
ドキュメントには、getEntry() で取得した値は、Graphics.getColorOfRGB(r, g, b) の返す値と同じ値が入ってる、とある。それを信じて、RGB値を別途持って自前で作成し直すことにしてみたり。
gif画像からパレット値を取得してテキスト出力する perlスクリプトを作成。ActivePerl 5.8.8 build 820 + ImageMagick 6.3.3 Q8 (PerlMagick) で。
_getpalette.pl
_出力結果。 これをJavaソースの中にコピペして使った。
P902iS で、ロードした画像から読んだパレット値と、Graphics.getColorOfRGB() の返り値を、トレース情報で出してみたり。左が、画像から読んだ値。右が、Graphics.getColorOfRGB() の返り値。
む。一番最後のパレット値の場所は、透過色指定されたソレの場所だな。そこだけは通常と異なる値を返す、ということなのか。考えてみれば、透過色なんだから入ってるRGB値はどうでもいいのだな。単に「ここが透過色である」ことを示す値さえ入ってれば、動作上の問題はないのかもしれん。
さておき。パレット値データをプログラム中に含めてしまったことで、プログラム容量が結構増えてしまった。残り 381byteしかない…。今現在、解決策として思いつくのは、以下のとおり。
エミュレータ上でのトレース情報。
PALIMG:0 EntryCount:16 ff000000 ff00f2ff ff05cbff ff251dee ff241ded ff241ced ff736783 ff8810e6 ffd8d6d4 ff2ab3ce ff317da6 ff1e90f6 ff33516b ff242e44 ff272fa7 ffffffff
P902iS上でのトレース情報。
PALIMG:0 EntryCount:16 0 ff80 fe40 e8e4 e8e4 e8e4 832e e091 d6bb cd85 a3e6 f483 6a86 4164 a164 20
値の関連性がまったく見えてこない。機種依存の値を返すのであろうか。となると、ロードした画像のパレットを読んで、計算で変化させて、なんて処理は無理ということに…。
ドキュメントには、getEntry() で取得した値は、Graphics.getColorOfRGB(r, g, b) の返す値と同じ値が入ってる、とある。それを信じて、RGB値を別途持って自前で作成し直すことにしてみたり。
gif画像からパレット値を取得してテキスト出力する perlスクリプトを作成。ActivePerl 5.8.8 build 820 + ImageMagick 6.3.3 Q8 (PerlMagick) で。
_getpalette.pl
_出力結果。 これをJavaソースの中にコピペして使った。
P902iS で、ロードした画像から読んだパレット値と、Graphics.getColorOfRGB() の返り値を、トレース情報で出してみたり。左が、画像から読んだ値。右が、Graphics.getColorOfRGB() の返り値。
PALIMG:0 EntryCount:16 0:0 ff80:ff80 fe40:fe40 e8e4:e8e4 e8e4:e8e4 e8e4:e8e4 832e:832e e091:e091 d6bb:d6bb cd85:cd85 a3e6:a3e6 f483:f483 6a86:6a86 4164:4164 a164:a164 20:ffff PALIMG:1 EntryCount:16 ffff:ffff e924:e924 47a:47a 47a:47a 1082:1082 2b4:2b4 356:356 126e:126e 3f8:3f8 2187:2187 4bb:4bb 59e:59e f681:f681 7ac6:7ac6 b555:b555 20:ffff PALIMG:2 EntryCount:16 ffff:ffff 0:0 f404:f404 f314:f314 (以下略)だいたいは合ってるみたいだけど。最後のパレット値だけが違う。何故。P902iSはドキュメント通りの実装状態じゃないということなのか。
む。一番最後のパレット値の場所は、透過色指定されたソレの場所だな。そこだけは通常と異なる値を返す、ということなのか。考えてみれば、透過色なんだから入ってるRGB値はどうでもいいのだな。単に「ここが透過色である」ことを示す値さえ入ってれば、動作上の問題はないのかもしれん。
さておき。パレット値データをプログラム中に含めてしまったことで、プログラム容量が結構増えてしまった。残り 381byteしかない…。今現在、解決策として思いつくのは、以下のとおり。
- 計算後のパレット値を持った画像を別に用意して、その画像のパレット値と差し替えるとか。
- 変化させたい画像の中に変更用のパレット値を余分に含めておくとか。
- スクラッチパッドにパレット値データを格納してしまうか。その場合、データの結合スクリプトを変更する必要が出てくるけれど。
◎ 2007/04/25追記: :
スクラッチパッドの中にgifがあるんだから、gifの中のパレット値格納場所を参照してRGB値を取り出せばいいんじゃないのか。ということに今頃気づいた。
[ ツッコむ ]
以上です。