forked from: forked from: webcam映像をRGB3色に着色して震えさせる
webcam映像のCMYK4色を抽出して震えさせる
*
* fork元ではRGBに着色した画像を合成する時の透明度の調整で
* 入力された色を擬似的に再現していたので、若干色が狂っていました。
* コレは入力された映像の色をCMYKに分離して再度合成しているだけなので
* 元の色は狂わず残っているはずです。
/**
* Copyright umi_kappa ( http://wonderfl.net/user/umi_kappa )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/gnsp
*/
// forked from beryu's forked from: webcam映像をRGB3色に着色して震えさせる
// forked from beryu's webcam映像をRGB3色に着色して震えさせる
/**
* webcam映像のCMYK4色を抽出して震えさせる
*
* fork元ではRGBに着色した画像を合成する時の透明度の調整で
* 入力された色を擬似的に再現していたので、若干色が狂っていました。
* コレは入力された映像の色をCMYKに分離して再度合成しているだけなので
* 元の色は狂わず残っているはずです。
*/
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.BlendMode;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.media.Camera;
import flash.media.Video;
public class VibratingCam extends Sprite {
// 震えの許容値
private const LATITUDE:Number = 20;
//bitmapdataの倍率
private var zoom:Number = 1.2;
private var _cam:Camera;
private var _vid:Video;
private var _bmp:Bitmap;
private var _bmpDataSrc:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
private var _bmpDataDst:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
private var _bmpDataC:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
private var _bmpDataM:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
private var _bmpDataY:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
private var _bmpDataK:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true);
public function VibratingCam()
{
// ビデオ準備
_cam = Camera.getCamera();
_cam.setMode(stage.stageWidth, stage.stageHeight, stage.frameRate);
_vid = new Video(stage.stageWidth, stage.stageHeight);
_vid.attachCamera(_cam);
// 表示用Bitmapに出力用bitmapを関連づける
_bmp = new Bitmap(_bmpDataDst);
_bmp.width = stage.stageWidth * zoom;
_bmp.height = stage.stageHeight * zoom;
// stageにadd
addChild(_bmp);
// イベント
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
// 基画像
_bmpDataSrc.draw(_vid);
// CMYK4色抽出
/*別の BitmapData オブジェクトまたは現在の BitmapData オブジェクトの 1 つのチャンネルのデータを、
* 現在の BitmapData オブジェクトのチャンネルに転送します。
* */
_bmpDataC.copyChannel(
_bmpDataSrc,
_bmpDataSrc.rect,
new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
BitmapDataChannel.RED,
BitmapDataChannel.RED
);
_bmpDataM.copyChannel(
_bmpDataSrc,
_bmpDataSrc.rect,
new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
BitmapDataChannel.GREEN,
BitmapDataChannel.GREEN
);
_bmpDataY.copyChannel(
_bmpDataSrc,
_bmpDataSrc.rect,
new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
BitmapDataChannel.BLUE,
BitmapDataChannel.BLUE
);
_bmpDataK.copyChannel(
_bmpDataSrc,
_bmpDataSrc.rect,
new Point(Math.random() * LATITUDE - LATITUDE, Math.random() * LATITUDE - LATITUDE),
BitmapDataChannel.ALPHA,
BitmapDataChannel.ALPHA
);
// 描画
_bmpDataDst.draw(_bmpDataC, null, new ColorTransform());
_bmpDataDst.draw(_bmpDataM, null, new ColorTransform(), BlendMode.MULTIPLY);
_bmpDataDst.draw(_bmpDataY, null, new ColorTransform(), BlendMode.MULTIPLY);
_bmpDataDst.draw(_bmpDataK, null, new ColorTransform(), BlendMode.MULTIPLY);
}
}
}