イメージ処理について
ここでは、イメージファイルを読み込んでbyte配列として取り出すメソッド、byte配列からImageを作成するメソッド、そしてImageを縮小処理するメソッドというように、処理ごとにメソッドを整理しています。GAE/Jに用意されているイメージ処理機能を使っているのは、TransformImageメソッドの部分です。ここでは、次のような形でイメージを縮小しています。
イメージの縮小は、com.google.appengine.api.imagesパッケージに用意されているクラスを利用します。ここでは、まずImagesServiceFactoryクラスの「makeResize」というクラスメソッドを呼び出しています。これは引数に横幅と縦幅を示すint値を渡して実行します。
Transform resize = ImagesServiceFactory.makeResize(w, h)
これで得られるのは、イメージそのものではなく、「Transform」というクラスのインスタンスです。これは、いわば「イメージの変換情報のクラス」といってよいでしょう。イメージの操作は、変換情報をTransformとして用意し、これをイメージに適用して行います。
Transformが用意できたら、次に行うのはイメージの操作を行う「ImagesService」インスタンスの取得です。これはImagesServiceFactoryクラスの「getImagesService」クラスメソッドで取得します。
ImagesService service = ImagesServiceFactory.getImagesService()
取得したImagesServiceの「applyTransform」を使い、イメージにTransformによる変換を適用します。引数にTransformとImageインスタンスを渡して呼び出すと、第1引数の変換処理を第2引数のImageに対して行い、その結果(変換済みのImage)を返します。後は、このイメージをクライアントに返送すればいいわけです。
return service.applyTransform(resize, img)
この他、引っかかりやすい点として「イメージファイルの読み込み」についても触れておきましょう。通常、イメージファイルの読み込みと言うと、ImageIOクラスや、FileInputStreamなどを使うと考えるでしょう。GAE/Jでも、FileInputStreamはサポートされていますが、これを利用してイメージファイルを読み込もうとしてもうまくいきません。リソースファイルの読み込みは、ServletContextの「getResource」や「getResourceAsStream」を利用して読み込みを行うようにしてください。
ImagesServiceFactoryに用意されているイメージ変換関係のメソッドは、ここで使ったmakeResize以外にもいろいろとあります。回転や上下左右の反転、切り抜き、イメージの合成などが高速に処理できます。基本的な流れが分かったら、transformImageメソッドを修正してさまざまなイメージ変換処理を試してみるとよいでしょう。
まとめ
今回は、GAE/Jで利用可能なサービスとして、認証、Gmail送信、イメージ処理といったものについてまとめて紹介しました。基本的な利用の仕方は、Javaによるものとそれほど違いはありません。ですから、Java向けのドキュメントなどを読み、そのままGroovyに利用すれば、大抵の機能は使えるようになるはずです。Groovyには、Javaにはない機能もあります。それはGroovyのスクリプトによるサーブレットであったり、Groovletであったり、GSPであったりしますが、こうしたものを利用することで、Javaよりも楽にコーディングができるようになるでしょう。
ただし、実際にGroovyを使ってプログラムを作成していくと、稀にですが「原因不明のエラー」に遭遇することもないわけではありません。今回も、イメージの出力で非常に長い時間、頭を悩ませました。もし、同じように「あっているはずなのに、なぜか動かない」というような現象に遭遇したら、まず「Javaで動くかどうか」を確認してみてください。それにより、それがGroovy特有の問題か、それともGAE/J自体の問題かを切り分けることができます。Groovy固有の問題であれば、その部分だけJavaを利用することで回避すればよいのですから。JavaとGroovyを上手に使い分ける。それがGroovyを快適に使うためのコツといってよいでしょう。
