Google App Engineで画像の加工ではまるところ
GAEでは画像の加工が出来ません。リサイズとかフォーマット変換とかそういうどうでもいいようなやつしかありません。
そこで実際にバイト操作でBMPをダイレクトに作り出して、そのbyte[]をGAEのImages APIにわたしてPNGに変換し、出力してみた。
…?出力されない。
でもエラーは出てないし、ちゃんとPNGとして認識をしている。ローカルの開発環境では問題なく出力されているのに!どうやらサーバーと開発ツールとで処理の内容に違いがあるらしい。同じにすればいいのに。バグだな。
このBMPは32bitBMPで作っている(ご想像の通り24bppにしなかったのは4バイト境界でそろえるのが面倒だったのです…)のだが、もしや!
ライブラリは変更せずに書き込みの上位8ビットに255を書き込むようにサーブレット側のソースを変更してみた。
あ、でた。
どうやら上位8ビットをαとして扱うらしい。通常BMPの上位8bitは使われない(アプリが独自に使うことはある)のであまくみていたようだ。
逆に言えばアルファも使えるということで、これはこれで面白いといえばきこえはいいが。
α値を設定するかどうか、背景色の設定などをライブラリに追加しよう。黒を設定するのに全てのピクセルに0xff000000を設定するのがだるすぎる。
アルファ入れて出力したときもスキーとノイズみたいなのがある。BMPからPNGへの変換なのでどう考えても劣化するとは思えないのだが、どうも内部でαつきJPEGあたりで変換処理やってる感じ。うーむ。
とりあえずテストできるようにJSF 2.0のサンプルのトップページに追加しておいた。赤青緑と3本の線を引いているのがわかるはず。
http://shinsan-jsf2.appspot.com/
GAEで画像を生成するという用途がおいら以外にあるとはあんまり思えないので公開しなくてよいか。おいらはゲーム等でたぶん使うかもなぁと思ったので。むしろ動的にfavicon作るほうが面白いのかもしれない。こちらのほうがヘッダ楽なはずなのでチャレンジおすすめ。
ちなみにこのBMP生成処理はCPUパワーぜんぜん食っていません。7cpu_msと空servletの2倍位。html等生成するほうがはるかにマシンパワー食うことからどんだけマシンパワー無駄遣いしてるかを考えてしまった。