SHOEISHA iD

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

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

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

HTML5で作る! 次世代スマートフォンOS「Tizen」アプリケーション

Tizen SDK 2.2の変更点・注意点と、カメラアプリの作例

HTML5で作る! 次世代スマートフォンOS「Tizen」アプリケーション(2)

調整して画面に表示

 次に、取得した画像データを縮小したり回転したりする処理を見てみましょう。

 手順としてはサイズを指定したCANVASエレメントに画像を回転してかつ縮小して貼り付ける処理をします。カメラで撮影した画像の回転情報はJavaScriptからJpeg画像のExif情報を読み出します。JavaScriptからJpeg画像のExif情報を読み出すライブラリはいくつか存在しますが、今回は回転(Orientation情報)のみを取得したいので、下記で公開されているシンプルなメソッド「getOrientation」を利用させていただくことにします。

 それでは、実際にCANVASを使って画像を処理していくソースを見てみましょう。

function onReadImage(e) {
    var imageSrc = e.target.result;

    /**
     * Case2. 画像をCanvasを利用して縮小、回転し、文字を載せて貼り付ける
     */

    // Exif情報からOrientationを取得
    var orientation = getOrientation(imageSrc) || 1;
    console.log(orientation)

    // 一時的なIMAGEエレメントを作成し、一時的なCANVASで画像処理をしてIMGを出力する
    var onLoadImageElement = function(e) {
        var imgEl = e.target;
        
        // 画像の本来の解像度を取得
        var w = imgEl.naturalWidth;
        var h = imgEl.naturalHeight;

        // canvasの解像度を指定
        var canvasWidth = 400;
        var canvasHeight = 400;
        var canvas = $("<canvas>").attr({
            width : canvasWidth,
            height : canvasHeight
        })

        // canvasの描画コンテキストを取得
        var context = canvas[0].getContext('2d');
        // これから変更する回転状態をいったん保存
        context.save();

        switch (orientation) {
        case 3:
            // 180 rotate left
            context.translate(canvasWidth, canvasHeight);
            context.rotate(Math.PI);
            break;
        case 6:
            // 90 rotate right
            context.rotate(0.5 * Math.PI);
            context.translate(0, -canvasHeight);
            break;
        case 8:
            // 90 rotate left
            context.rotate(-0.5 * Math.PI);
            context.translate(-canvasWidth, 0);
            break;
        default:
        }

        // canvasの幅に短辺を合わせて中心に描画する処理
        if (w > h) {
            context.drawImage(imgEl, (w - h) / 2, 0, h, h, 0, 0,
                    canvasWidth, canvasHeight)
        } else {
            context.drawImage(imgEl, 0, (h - w) / 2, w, w, 0, 0,
                    canvasWidth, canvasHeight)
        }
        // 文字などを上書きするために回転状態を解除する
        context.restore();
        
        // 文字などを張り付けていく
        var caption = "#MyTizenCameraApp";
        context.font = "32px 'Tizen, Helvetica'";
        context.lineWidth = 5;
        context.strokeStyle = "#333333";
        context.strokeText(caption, 30, canvasHeight - 30);    
        context.fillStyle = "#dbd0e6";
        context.fillText(caption, 30, canvasHeight - 30);
        
        //画像を出力する
        $("#inputImage").attr("src", canvas[0].toDataURL("image/png"));
        
        /**
         * ページ2へ移動
         */
        $.mobile.changePage("#two");
        
    }
    $("<img>").load(onLoadImageElement).attr("src", imageSrc);        
}

 以上のようにすることで、カメラから取得した画像を適切な回転と解像度で表示することができます。

まとめ

 本稿ではTizen SDK 2.2についての解説と、カメラアプリを作るにあたってのカメラ画像の取得とその画像処理、表示までを解説しました。HTMLの独特の書き方に慣れていない方は、若干戸惑ってしまう部分もあるかもしれません。しかし、慣れてしまえば他のOSのアプリケーションに比べ、非常に短いコードでアプリケーションが作成できることがお分かりになるかと思います。

 また、アプリケーションの書き方が標準化されているので、他OSや今後のOSのバージョンアップなどによる変更にも強くなっています。コンパイルを挟む必要もないので、レイアウトの確認やデバッグも高速で行うことが可能です。また、HTML部分とプログラム部分の自由な切り分けができるため、プログラマーとデザイナーでの分業がしやすいことも、非常に魅力的です。

 次回は、今回紹介したカメラアプリの続きとして、豊富なオープンソースのJavaScriptライブラリを駆使した画像処理やTwitter投稿、また、DeviceAPIを用いてのファイルの読み書きやギャラリーへの画像登録などの解説をしていきたいと思います。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
HTML5で作る! 次世代スマートフォンOS「Tizen」アプリケーション連載記事一覧

もっと読む

この記事の著者

松園 勝喜(ピーシーフェーズ株式会社)(マツゾノ カツキ)

組み込み系エンジニア時代は携帯電話を使った研究開発に取り組む。ピーシーフェーズ入社後は、各種モバイル向けアプリのサーバーサイドを主に担当する傍、クライアントサイドの開発も担当。

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

橋本 悟(ピーシーフェーズ株式会社)(ハシモト サトル)

ピーシーフェーズにて、モバイル向けの各種アプリケーション開発やサーバーサイド開発を担当。主に受託開発を行いながら新規技術の調査開発などにも従事

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7343 2013/09/04 14:00

イベント

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

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

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

メールバックナンバー