SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine for Javaを使ってみよう!

Google App Engine for Javaを使ってみよう!
(2)Images Java API の使い方

Google App Engine for Javaを使ってみよう! (2)

Images Java APIを実行する

 これまでの手順で、ライブラリの準備ができましたので、サーバサイドのプログラムを書いていきたいと思います。処理内容は、最初に説明したのと同じ拡大/縮小処理です。

ImageTestServlet クラス
package com.daisukeyamashita.test.images;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.google.appengine.api.images.Image;
import com.google.appengine.api.images.ImagesService;
import com.google.appengine.api.images.ImagesServiceFactory;
import com.google.appengine.api.images.Transform;
import com.google.appengine.api.images.ImagesService.OutputEncoding;

@SuppressWarnings("serial")
public class ImageTestServlet extends HttpServlet {

    @SuppressWarnings("unchecked")
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        MemoryFileItemFactory factory = new MemoryFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        resp.setContentType("image/png");
        OutputStream out = resp.getOutputStream();

        try {
            List<FileItem> list = upload.parseRequest(req);
            for (FileItem item : list) {
                if (!(item.isFormField())) {
                    String fileName = item.getName();
                    if (fileName != null && !"".equals(fileName)) {
                        int size = (int) item.getSize();
                        byte[] data = new byte[size];

                        InputStream in = item.getInputStream();
                        in.read(data);
                        ImagesService imagesService = ImagesServiceFactory.getImagesService(); //(1)

                        Image oldImage = ImagesServiceFactory.makeImage(data); //(2)
                        Transform resize = ImagesServiceFactory.makeResize(300, 50); //(3)
                        Image newImage = imagesService.applyTransform(resize, oldImage,
                                OutputEncoding.PNG); //(4)

                        byte[] newImageData = newImage.getImageData();

                        out.write(newImageData);
                        out.flush();
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }

    }
}

 サーバサイドの処理が完成しましたので、クライアント側のHTMLを用意したいと思います。「war/index.html」を以下のように書き換えて下さい。

war/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Hello App Engine</title>
  </head>
  <body>
    <h1>Hello Google App Engine for Java with Images Java API!!!</h1>
    <form method="POST" enctype="multipart/form-data" action="imagetest">
        <input type="file" name="file" /></br>
        <input type="submit" value="upload" />
    </form>
  </body>
</html>

 これで、すべての準備が整いました。プロジェクト名を右クリックして、[Run As]-[Web Application]を選択してください。

 Consoleに以下のように表示されればローカルサーバの起動が完了です。好きなブラウザで「http://localhost:8080/」にアクセスしてみましょう。

 前回、表示されていた簡易ブラウザはGWTのデバッグ専用ブラウザですので、今回のようにGWTを利用しないプロジェクトでは起動しません。

 以下のように表示されていればOKです。[ファイルを選択]ボタンをクリックして、手元にある画像ファイルを選択してから、[upload]ボタンをクリックします。

 画像が縮小されているのを確認できるかと思います。

ImagesServiceFactoryの加工処理メソッド一覧
目的 メソッド 備考
サイズ変更 makeResize(int width, int height) width : 幅
height : 高さ
縦回転 makeVerticalFlip()  
横回転 makeHorizontalFlip()  
回転 makeRotate(int degrees) degrees
切り出し makeCrop(double leftX, double topY, double rightX, double bottomY)
makeCrop(float leftX, float topY, float rightX, float bottomY)
leftX : 左座標
topY : 上座標
rightX : 右座標
bottomY : 下座標
画質自動調整 makeImFeelingLucky() この機能はローカルテストで利用できません。
ローカルテスト環境での画像拡大/縮小

 画像の荒さが気になった方もいるかと思いますが、ローカルテスト時には画像処理をローカルマシンで実行する必要があり、本番とは別の負荷が軽い(けど荒くなる)拡大/縮小処理方法になっているためです。実際にGoogle App Engineにサービスをデプロイすると、 エッジのきれいな画像が表示されます。

まとめ

 今回は画像処理を勉強しましたが、いかがでしたでしょうか? 今回の記事で、Google App EngineのImages Java API は非常に簡単に利用できるということが分かっていただけたかと思います。

 Google App Engineはファイルの出力、JNI経由のネイティブプログラムが利用できないという制限がありますが、今回利用したApache CommonsライブラリのようにPure Javaで記述されたプログラムであれば、Google App Engine上で動かすことができますので、他の画像処理ライブラリを利用することでさらに高度な加工処理を実行することもできます。

 興味のある方は、他のライブラリでの画像加工にも挑戦してみてはいかがでしょうか?

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Google App Engine for Javaを使ってみよう!連載記事一覧

もっと読む

この記事の著者

山下 大介(ヤマシタ ダイスケ)

  京都大学を中心とした、産官学共同プロジェクトのSOBAプロジェクトに参加後、同プロジェクトで開発したP2P配信によるVoIP技術を2005年に商業化。オープンソース、VoIP、P2P、クラウドコンピューティングに精通。趣味はGoogleの追っかけ。現在は、株式会社SOBAプロジェクト取締役。ブログ:『~ ミネルヴァの梟は黄昏とともに飛び始める ~』所属:株式会社SOBAプロジェクトGoogle Developer Day 2008サポーター, 2009サポーターGoogle App Engine API Expert

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3836 2009/04/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー