Google App Engine for Javaで画像にマスクをかける

以前も書いたが、Google App Engine for Javaではjava.awt.image.BufferedImageなんかが使えないので、代わりのImage Manipulation APIを使うしかない。これには画像を合成する機能はあるが、図形を描く機能はない。しかし仕事で動的に生成したマスクを画像にかける必要が出てきたので、なんとかしなければいけなかった。

最初に、1ピクセル四方の画像を読み込んでそれをひたすら合成してマスクを作ることを考えた。ImagesServiceFactoryのmakeCompositeでひたすらCompositeを作成して、Listに格納して、ImagesServiceのcompositeでまとめて合成しようとするとエラーが出た。エラーメッセージによると、まとめて合成できるCompositeは16個までらしい。そんなに少ないならリファレンスにそう書いておいてくれよ、と思った。

そこでCompositeが16個たまったら一旦合成してまたmakeCompositeして今度はそれと次の15個を合成してまたmakeCompositeして…という面倒なことをやってその制限を回避しようと試みた。しかしまたエラーが出た。なんと無料アカウントではImage Manipulation APIは1分に4,800回までしか呼び出せないとのこと。

割り当て - Google App Engine - Google Code

画像の合成でマスクを作るのはあきらめ、マスク画像のバイト列を手動で生成して、それをAPIで読み込んで合成することにした。圧縮がないビットマップがよさそうだ、でもビットマップはアルファチャンネルを持てないのでは、どうやら32ビットのビットマップなら持てるらしい、などと調べているうちに、同じようなことをやっている人を見つけた。

GAEjでお絵かき - COLUN++ BLOG

これを参考にしてマスク画像のバイト列を生成し、それを元画像と合成することで、無事画像にマスクをかけることができた。