カメラの映像を画像化してループ
カメラ映像から画像化するテスト。
画面をクリックすると画像化される。
とりあえずは、細かくずらして複製してる。
マスクしてみた。
切り取った画像の表示位置をループさせてもみた。
*****注意*****
画像が無限に重なるのでどこかでremoveした方がいいと思う。
あと画像のエッジjがきたないので、もうちょっとべ調整してみよう。
テキストもフォント選ばないと切れたり、alignがcenter
// forked from se_nakamura's forked from: forked from: flash on 2009-2-18
// forked from se_nakamura's forked from: flash on 2009-2-18
// forked from hacker_aqzeiers's flash on 2009-2-18
// カメラ映像から画像化するテスト。
// 画面をクリックすると画像化される。
// とりあえずは、細かくずらして複製してる。
//
// マスクしてみた。
// 切り取った画像の表示位置をループさせてもみた。
// *****注意*****
//画像が無限に重なるのでどこかでremoveした方がいいと思う。
// あと画像のエッジjがきたないので、もうちょっとべ調整してみよう。
// テキストもフォント選ばないと切れたり、alignがcenter
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.BlendMode;
import flash.events.MouseEvent;
import flash.media.Camera;
import flash.media.Video;
import flash.text.*;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.BitmapDataChannel;
import flash.geom.Point;
import flash.geom.Rectangle;
public class VideoCapMain extends flash.display.Sprite {
var camera_width:int=160;
var camera_height:int=120;
var bitmap_x_offset:int=100;
var bitmap_y_offset:int=100;
var yCount:int=1;
var xCount:int=1;
var video:Video=new Video(camera_width,camera_height);
var myClip:Sprite=new Sprite ();
var maskObj:Sprite=new Sprite();
var timer:Timer;
//ループの間隔
var loopTime:int=200;
var my_txt:TextField;
var my_fmt:TextFormat;
//var my_fmt:TextFormatAlign
public function VideoCapMain():void {
//ボタンモードture
myClip.buttonMode=true;
//カメラを取得して表示
var camera:Camera=Camera.getCamera();
if (camera!==null) {
video=new Video(160,120);
video.attachCamera(camera);
//video.visible=false;
// ビデオをそのまま表示オブジェクトに
//video.mask=maskObj;
//addChild(video);
// マスクをかける
myClip.mask=maskObj;//ここでまだ生成されていないmaskObjを使ってもマスクがかかるのはなぜ?
myClip.addChild(video);//
addChild(myClip);
}
//クリックするバージョンの時使う。
myClip.addEventListener(MouseEvent.CLICK,onClick);
//マスクオブジェ
maskObj.graphics.clear();
maskObj.graphics.lineStyle(0,0,0);
maskObj.graphics.beginFill(0xffffff);
maskObj.graphics.drawCircle(video.width/2,video.height/2,50);
maskObj.graphics.endFill();
//addChild(maskObj)
//ループ
timer=new Timer(loopTime);
timer.addEventListener(TimerEvent.TIMER,loop);
//timer.start();
//
//テキストフィールド
my_txt= new TextField();
//my_txt.autoSize = 'left';
//my_txt.autoSize=TextFieldAutoSize.CENTER;
my_txt.type=TextFieldType.DYNAMIC;
my_txt.border=true;
my_txt.borderColor=0x000000;
my_txt.text="←映像をクリックしてスタート。"+loopTime/1000+"秒ごとに画像を表示";
my_txt.x=200;
my_txt.y=50;
my_txt.width=my_txt.textWidth+100;
my_txt.height=my_txt.textHeight+5;
//
my_fmt=new TextFormat();
my_fmt.size=10;
my_fmt.align="center";
my_txt.setTextFormat(my_fmt);
addChild(my_txt);
}
//
//TimerLoop
private function loop(event:TimerEvent):void {
var bd:BitmapData=new BitmapData(160,120,true,0x000000);
//BitmapDataにmyClipをdrawする。ここで画像を切り取っている?
bd.draw(myClip);
//切り取った画像をBitmapに入れている。
var img:Bitmap=new Bitmap(bd);
//(未解決)枠を消したい。
//img.mask=maskObj;
//img.blendMode=BlendMode.MULTIPLY;
//
//透明マップを読み込み
/////-- var bmp:Bitmap = new Bitmap(bd);
/*var bd2:BitmapData=new BitmapData(160,120,true,0x000000);
bd2.draw(maskObj);
var bmpAlpha:Bitmap=new Bitmap(bd2);
*/
//不透明用
//var bd2:BitmapData=img.bitmapData.clone();
//透明化する
/*img.bitmapData.copyChannel(bmpAlpha.bitmapData , bmpAlpha.bitmapData.rect ,
new Point(0,0) ,
BitmapDataChannel.ALPHA ,
BitmapDataChannel.ALPHA);*/
//
//表示リストにくわえる
addChild(img);
if (yCount==1) {
img.y=img.y+bitmap_y_offset*yCount;
img.x=img.x+bitmap_x_offset*(xCount-1);
} else {
img.y=img.y+bitmap_y_offset*yCount;
img.x=img.x+bitmap_x_offset*(xCount-1);
}
//クリックした回数
yCount=yCount+1;
//画像の表示位置をループさせてる。
if (yCount>5) {
yCount=1;
yCount=yCount+1;
img.y=bitmap_y_offset;
img.x=bitmap_x_offset*xCount;
xCount=xCount+1;
if (xCount>5) {
xCount=1;
img.x=0;
} else {
}
}
trace("y"+yCount)
trace("x"+xCount);
trace(img.x);
}
//
private function onClick(event:MouseEvent):void {
timer.start();
/*var bd:BitmapData=new BitmapData(200,150);
//BitmapDataにmyClipをdrawする。ここで画像を切り取っている?
bd.draw(myClip);
//切り取った画像をBitmapに入れている。
var img:Bitmap=new Bitmap(bd);
//それを表示リストにくわえる
//img.mask=maskObj;
addChild(img);
if (yCount==1) {
img.y=img.y+camera_height*yCount;
img.x=img.x+bitmap_x_offset*(xCount-1);
} else {
img.y=img.y+bitmap_y_offset*yCount;
img.x=img.x+bitmap_x_offset*(xCount-1);
}
//クリックした回数
yCount=yCount+1;
//画像の表示位置をループさせてる。
if (yCount>4) {
yCount=1;
yCount=yCount+1;
img.y=camera_height;
img.x=bitmap_x_offset*xCount;
xCount=xCount+1;
if (xCount>5) {
xCount=1;
img.x=0;
} else {
}
}
//trace("y"+yCount)
trace("x"+xCount);
trace(img.x);*/
// ---------以下は未使用------------
//クローン
/*var copy_bmp : Bitmap= new Bitmap(myClipSet.bitmapData.clone());
addChild(copy_bmp);
copy_bmp.x=300;*/
//--------ビットマップキャッシュにする方法
/*myClip.cacheAsBitmap=true;
maskObj.cacheAsBitmap=true;
myClip.mask=maskObj;
*/
//-------------//
// ビデオにマスク
//myClip.mask=maskObj;
//video.mask=maskObj;
/*var maskbd:BitmapData=new BitmapData(camera_width,camera_height);
maskbd.draw(maskObj);
var maskImg:Bitmap=new Bitmap(maskbd);*/
//img.mask=maskObj;
//maskImg.mask=maskObj;
//img.mask=maskImg;
/*フィルタを適用する範囲,位置を指定するための情報を準備
var rect:Rectangle=new Rectangle(0,0,maskbd.width,maskbd.height);
bd.copyChannel(maskbd, rect, new Point(0, 0), BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA);
*/
//
/*if (bitmap_y_offset>=stage.stageHeight) {
bitmap_count+=1;
//bitmap_x_offset+=205;
bitmap_y_offset=0;
img.x=bitmap_x_offset;
img.y=bitmap_y_offset;
trace("C");
*/
/*} else {
//img.x = 0;
img.x=bitmap_x_offset*bitmap_count;
img.y=bitmap_y_offset;
bitmap_y_offset=bitmap_y_offset+155;
trace("a");
*/
//trace(bitmap_y_offset);
}
}
}