Windows Phoneアプリケーション開発入門

第37回 Mangoで追加されたカメラ機能を使ってみよう!(3)

この記事を読むのに必要な時間:およそ 9 分

エフェクト処理の紹介:グレイスケール

画像

グレイスケールは白と黒とその中間色で表現した言わば白黒写真です。白黒写真と言っても色空間やガンマ値を考慮した沢山の方法があります。R成分,G成分,B成分の最大値と最小値を足して2で割る中間値法や,R成分,G成分,B成分のそれぞれの要素に重み付けをして平均を取る加重平均法等です。

今回は一番簡単な単純平均法を使用しましょう。1ピクセルのR成分,G成分,B成分の要素をすべて足し合わせて,3で割り平均値を取っています。

        /// <summary>
        /// 画像バッファをグレイスケール化する
        /// </summary>
        public void EffectGrayscale() {

            for (int i = 0; i < Buffer.Length; i++) {
                int pixel = Buffer[i];

                // RGB値を取り出す
                byte r = Convert.ToByte((pixel >> 16) & 0xff);
                byte g = Convert.ToByte((pixel >> 8) & 0xff);
                byte b = Convert.ToByte(pixel & 0xff);

                // 単純に平均値を取る
                byte avg = (byte)((r + g + b) / 3);

                Buffer[i] = 255 << 24 | avg << 16 | avg << 8 | avg;
            }
        }

エフェクト処理の紹介:カラーエフェクト

画像

赤,緑,青の3色によるカラーエフェクト処理です。この3色は計算処理が不要で,それぞれ用のビットマスクを使用するだけでエフェクトを得ることが可能です。

        public enum ColorEffectType {
            Red,
            Green,
            Blue
        }

        /// <summary>
        /// 画像バッファにカラーエフェクトを掛ける
        /// </summary>
        public void EffectColor(ColorEffectType effectType) {
            // 各RGB要素のいずれかの要素だけ有効にする
            if (effectType == ColorEffectType.Red) {
                for (int i = 0; i < Buffer.Length; i++)
                    Buffer[i] &= 0xff0000;
            } else if (effectType == ColorEffectType.Green) {
                for (int i = 0; i < Buffer.Length; i++)
                    Buffer[i] &= 0x00ff00;
            } else if (effectType == ColorEffectType.Blue) {
                for (int i = 0; i < Buffer.Length; i++)
                    Buffer[i] &= 0x0000ff;
            }
        }

エフェクト処理の紹介:ネガポジ反転

画像

デジカメの時代となって久しいですが,現像の際に写真屋さんで反転と共に補正を行いやすくするために,写真の明暗や色を反転させたネガフィルムを利用して現像していました。

正しく見えるピクチャーフレームを加工するので,現像とは逆に画像のピクセル情報を反転させるだけです。

        /// <summary>
        /// 画像バッファをネガポジ反転させる
        /// </summary>
        public void EffectNegative() {
            for (int i = 0; i < Buffer.Length; i++) {
                int pixel = Buffer[i];
                // 各RGB要素のビットを反転させる
                Buffer[i] = pixel ^ 0x00ffffff;
            }
        }

以上で,エフェクト処理についてのご紹介は終わりです。

YCbCr形式のプレビューフレームを取得してバーコード解析を行う

続いて,冒頭の「CameraPreviewTest_Barcode」のほうのサンプルプロジェクトを使用しながらTipsをご紹介します。YCbCr形式のプレビューフレームを取得しバーコード解析を行いたいと思います。

PhotoCamera.GetPreviewBufferYCbCrメソッドを利用すると,YCbCrフォーマットでプレビュー中のフレームを取得することができます。

YCbCrフォーマットは,輝度信号Yと2つの色差信号(Cb,Cr)を使って表現します。⁠人間の目は明るさの変化には敏感だが色の変化には鈍感」という性質に基づいた色空間で,明るさ(イメージ的には白黒テレビです)の情報Yと,色を表す情報のCb,Crが分離されているのが特徴です。

バーコードの解析には色の情報は不要ですので,プレビューフレームの輝度信号Yだけを取得するPhotoCamera.GetPreviewBufferYメソッドを使用しましょう。メソッドの定義は以下の通りとなっており,GetPreviewBufferArgb32メソッドと異なる点は引数がbyte[]型になっているところです。

public void GetPreviewBufferY(
    byte[] pixelData
)

今回バーコードの解析にライブラリを使用します。コードでの実装例の前に「Windows Phone 7 Silverlight ZXing Barcode Scanning Library」を紹介したいと思います。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/