タグ : 20100923β

カメラにアクセスする1 (Camera)

[この記事はベータ版(2010/09/23版)でしか確認をとれていません。正式リリース後に変更されている可能性もありますので参考程度にご覧ください。]

airforandroidでは、Cameraにアクセスする方法は2種類あります。
・Camera(昔からあるカメラ)
・CameraUI(デバイス備え付けのカメラアプリからデータを受ける)

詳しく知りたい方はこちら(airforandroid forum)

ここではCameraについて説明します。

まず設定から。
自分の持ってるNexusOneではすこし癖がありカメラでとったものが90度回転してしまっています。
なので、書き出し設定を以下のように設定しています。

・パーミッション設定

・書き出し設定

カメラにアクセスするサンプルスクリプト

package
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.media.Camera;
	import flash.media.Video;

	public class Main extends Sprite
	{

		public function Main()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			if (Camera.isSupported) {
				var w:int = stage.stageWidth;
				var h:int = stage.stageHeight;
				//カメラをゲット
				var camera:Camera = Camera.getCamera();
				//カメラの解像度のキャプチャの更新頻度(fps)を設定(w,h,fps)
				camera.setMode(w, h, 10);
				//表示用のビデオを作成
				var video:Video = new Video(w, h);
				//ビデオとカメラを関連付ける
				video.attachCamera(camera);
				addChild(video);
			}
		}
	}
}

カメラを表示するだけでなく、撮った画像を保存するところまで行います。
保存方法は色々有りますが、ここでは簡単なカメラロールに保存する方法を紹介します。

カメラロールに保存する

デバイスのカメラロールに保存するためにはCameraRollを使います。
下のサンプルでデータを保存している箇所は下の2行です。

var cameraroll:CameraRoll = new CameraRoll();
cameraroll.addBitmapData(bmpd);

package
{
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.media.Camera;
	import flash.media.CameraRoll;
	import flash.media.Video;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	import flash.events.TouchEvent;

	public class Main extends Sprite
	{
		var w:int;
		var h:int;
		var video:Video;

		public function Main()
		{
			Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			w = stage.stageWidth;
			h = stage.stageHeight;

			if (Camera.isSupported) {

				//カメラをゲット
				var camera:Camera = Camera.getCamera();
				//カメラの解像度のキャプチャの更新頻度(fps)を設定(w,h,fps)
				camera.setMode(w, h, 10);
				//表示用のビデオを作成
				video = new Video(w, h);
				//ビデオとカメラを関連付ける
				video.attachCamera(camera);
				addChild(video);

				stage.addEventListener(TouchEvent.TOUCH_TAP, saveData);
			}
		}
		//渡されたビットマップデータを保存する
		private function saveData(e:TouchEvent):void {
			var bmpd:BitmapData = new BitmapData(w, h, false, 0xFFFFFF);
			bmpd.draw(video);
			//カメラロールのインスタンスを作成する。
			var cameraroll:CameraRoll = new CameraRoll();
			//カメラロールにbitmapdataそのまま放り込む。これで保存完了
			cameraroll.addBitmapData(bmpd);
		}
	}
}

カメラロールはとても簡単ですが、圧縮率が調整できないので、かなり画質部分については不満が出るかもしれません。
これを解消するためにjpgファイルとして保存する方法がありますが、処理が重すぎてアプリ自体が強制終了してしまうので、かなりシビアに調整する必要があります。この方法についても改めて紹介したいと思います。

おまけ1:flatoolkit sample
処理速度がどれくらいになるかflatoolkitで動作確認してみました。↓こんな感じ。
javaで作ったものと比べるとやはりもたつくので複雑なアニメーションとかオブジェクトをかぶせるとしんどいかも?

おまけ2:エフェクトカメラ サンプル
Cameraの上のレイヤーにドラッグできるレイヤーモードを加算にしたMovieClipを配置した、簡単カメラエフェクト。