イメージ処理について
ここでは、イメージファイルを読み込んで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を快適に使うためのコツといってよいでしょう。