forked from: カメラ映像をテキストで再描画
4/1にこのネタでポストしていたのですが、youtube.comのcrossdomain
が突破出来ずに、うまいこと出来ませんでした。
http://wonderfl.net/code/35f947c67cea4a896fef0c70fd720d0b905ddef0
そうか!webcam使えば関係ないのか。。。。
元ネタは、2010年のYouTubeのエイプリルフールネタです。
http://youtubejpblog.blogspot.com/2010/03/textp-youtube.html
動画を全てテキストで処理してお届けしますよ(そうするとエコでしょ?)みたいなヤツだったのですが、
flashでリアルタイム処理出来ないかと思い至ったので、やってみました。
ソースを見ると気づくと思いますが、元ネタは、カメラ映像のモザイク処理です。
rsakaneさんのwikiに掲載のコードを使用しています。
http://www40.atwiki.jp/spellbound/?cmd=word&word=%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF&type=normal&page=%E7%94%BB%E5%83%8F%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
なお、ソースは思いつくままに書いたのでかなりこってりしたコードです。
_blockSizeで、モザイク処理するピクセルサイズ(=フォントのサイズ)を変更出来ます。
_pixelOffsetは、テキストフィールドの位置とフォントの位置を合わせるために使用しているオフセット値です。
/**
* Copyright 9re ( http://wonderfl.net/user/9re )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/kwLg
*/
// forked from kitsuneotoko's カメラ映像をテキストで再描画
/*
4/1にこのネタでポストしていたのですが、youtube.comのcrossdomain
が突破出来ずに、うまいこと出来ませんでした。
http://wonderfl.net/code/35f947c67cea4a896fef0c70fd720d0b905ddef0
そうか!webcam使えば関係ないのか。。。。
元ネタは、2010年のYouTubeのエイプリルフールネタです。
http://youtubejpblog.blogspot.com/2010/03/textp-youtube.html
動画を全てテキストで処理してお届けしますよ(そうするとエコでしょ?)みたいなヤツだったのですが、
flashでリアルタイム処理出来ないかと思い至ったので、やってみました。
ソースを見ると気づくと思いますが、元ネタは、カメラ映像のモザイク処理です。
rsakaneさんのwikiに掲載のコードを使用しています。
http://www40.atwiki.jp/spellbound/?cmd=word&word=%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF&type=normal&page=%E7%94%BB%E5%83%8F%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
なお、ソースは思いつくままに書いたのでかなりこってりしたコードです。
_blockSizeで、モザイク処理するピクセルサイズ(=フォントのサイズ)を変更出来ます。
_pixelOffsetは、テキストフィールドの位置とフォントの位置を合わせるために使用しているオフセット値です。
*/
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.media.Camera;
import flash.media.Video;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.system.Security;
import flash.system.SecurityDomain;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.ByteArray ;
import net.hires.debug.Stats
[SWF(frameRate=12,width=465,height=465,backgroundColor="#000000")]
public class FlashTest extends Sprite {
private var bitmapData:BitmapData;
private var textField:TextField;
private var unitW:int;
private var unitH:int;
private var row:int;
private var column:int;
private var palette:Array;
private var sh:int;
private var sw:int;
private var lastTime:int;
private var bitmapWidth:int;
private var bitmapHeight:int;
private var size:int = 12;
private var camera:Camera;
private var _video:Video;
private var _palette:String = "@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";
public function FlashTest() {
palette = _palette.split("");
//Security.allowDomain('*');
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
//sw = stage.stageWidth;
//sh = stage.stageHeight;
//sw = sh = 465;
sw = 465;
sh = 465 * 2 / 3;
x = 465 >> 1;
y = 465 >> 1;
//addChild(loader);
camera = Camera.getCamera();
if (camera) {
_video = new Video(sw, sh);
_video.attachCamera(camera);
playerReady();
}
}
private function playerReady():void {
bitmapData = new BitmapData(sw >> 3, sh >> 3);
bitmapWidth = bitmapData.width;
bitmapHeight = bitmapData.height;
textField = new TextField;
textField.text = 'A\nAA';
textField.setTextFormat(new TextFormat('_typewriter', size, null, true));
var rect:Rectangle = textField.getCharBoundaries(3);
unitW = rect.x;
unitH = rect.y;
column = sw / unitW + 1;
row = sh / unitH + 1;
textField.text = '';
textField.width = sw;
textField.height = sh;
textField.x = -sw >> 1;
textField.y = -sh >> 1;
textField.multiline = true;
textField.mouseEnabled = false;
addChild(textField);
addEventListener(Event.ENTER_FRAME, update);
}
private function update(e:Event):void
{
removeEventListener(Event.ENTER_FRAME, update);
bitmapData.draw(_video, new Matrix(1 / 8, 0, 0, 1 / 8));
var htmlText:String = '<font face="_typewriter" size="'+size+'"><b>';
var col:uint;
var r:int;
var g:int;
var b:int;
var index:int;
var pix:ByteArray = bitmapData.getPixels(bitmapData.rect);
for (var j:int = 0; j < row; ++j)
{
for (var i:int = 0; i < column; ++i)
{
index = (((unitW * i) >> 3) + bitmapWidth * ((unitH * j) >> 3)) << 2;
r = pix[1+index];
g = pix[2+index];
b = pix[3+index];
col = (r << 16) | (g << 8) | b;
//htmlText += '<font color="#' + (col.toString(16)) + '">' + palette[(63 - (r + g + b) / 12)>>0] + '</font>';
htmlText += '<font color="#' + (col.toString(16)) + '">' + _palette.charAt((63 - (r + g + b) / 12)>>0) + '</font>';
}
htmlText += '\n';
}
textField.htmlText = htmlText + '</b></font>';
addEventListener(Event.ENTER_FRAME, update);
}
}
}