2値化
/**
* Copyright shohei909 ( http://wonderfl.net/user/shohei909 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/mUTC
*/
// forked from shohei909's 輪郭抽出
// forked from shohei909's decolorエフェクト
// forked from shohei909's NowLoading ライブラリ
// forked from shohei909's NowLoading
/*
http://www.flickr.com/photos/smeerch/2575865183/
*/
package {
import flash.events.MouseEvent;
import flash.events.Event;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.system.LoaderContext;
import flash.net.URLRequest;
import flash.display.Sprite;
import net.kawa.tween.KTween;
[SWF(backgroundColor="0",frameRate = "60")]
public class FlashTest extends Sprite {
private const W:int = 465;
private const H:int = 465;
private const SIZE:int = 465;
private var count:int = 0;
private var loader:Loader = new Loader();
private var nowLoading:NowLoading = new NowLoading(onLoaded);
private var source:BitmapData = new BitmapData(W,H,false,0);
private var decolored:BitmapData;
private var bitmapData:BitmapData = new BitmapData(W,H,false,0);
private var bitmap:Bitmap;
public var rate:Number = 0;
public function FlashTest(){
with(graphics){
beginFill( 0x222222, 1 );
drawRect(0,0,W,H)
}
//ロードを開始する
loader.load(
new URLRequest("http://farm4.static.flickr.com/3127/2575865183_7aaf436871.jpg"),
new LoaderContext(true)
);
//ローダーを登録する
nowLoading.addLoader(loader);
addChild( nowLoading );
}
//ロードが完了したときに呼び出す
private function onLoaded():void{
//ロード画面を消す
KTween.to( nowLoading, 1, {alpha:0} ,null, function _():void{ removeChild( nowLoading );} );
init();
}
//初期化
private function init():void{
var rect:Rectangle = RabBit.autoSizeDraw( source, loader );
var b:BitmapData = bitmapData = source.clone();
bitmap = new Bitmap( bitmapData );
RabBit.monocolor( b, b, rect, new Point(rect.x , rect.y) );
bitmap.x = ( W - SIZE ) / 2;
bitmap.y = ( H - SIZE ) / 2;
addChild( bitmap );
stage.addEventListener( "mouseDown", onOver);
stage.addEventListener( "mouseUp", onOut);
}
private function onOver(e:MouseEvent):void{
bitmap.bitmapData = source;
}
private function onOut(e:MouseEvent):void{
bitmap.bitmapData = bitmapData;
}
}
}
import flash.filters.BlurFilter;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.geom.Rectangle;
class RabBit{
static public const ALING_CENTER:int = 0;
static public const ALING_LEFT:int = 1;
static public const ALING_RIGHT:int = 2;
static public const ALING_TOP:int = 3;
static public const ALING_BOTTOM:int = 6;
static public function autoSizeDraw( bitmapData:BitmapData, sourceImage:*, rect:Rectangle=null, aling:int = 0 ):Rectangle {
if(! rect ){ rect = bitmapData.rect; }
var rw:int = rect.width;
var rh:int = rect.height;
var sw:int = sourceImage.width;
var sh:int = sourceImage.height;
var rate:Number = rw / sw;
var rateH:Number = rh / sh;
rate = rate < rateH ? rate : rateH ;
var nw:int = sw * rate;
var nh:int = sh * rate;
var x:int = rect.x,y:int = rect.y;
switch( aling % 3 ){
case ALING_LEFT:
x += 0;
break;
case ALING_RIGHT:
x += ( rw - nw ) >>0;
break;
default:
x += ( rw - nw ) >> 1;
}
switch( ((aling/3)>>0 % 3) * 3 ){
case ALING_TOP:
y += 0;
break;
case ALING_BOTTOM:
y += ( rh - nh ) >> 0;
break;
default:
y += ( rh - nh ) >> 1;
}
var mtr:Matrix = new Matrix( rate, 0, 0, rate, x, y );
bitmapData.draw( sourceImage, mtr );
return new Rectangle(x,y,nw,nh);
}
static private var outlinefilter1:OutlineFilter;
static private var outlinefilter2:OutlineFilter;
static private var outlinefilter3:OutlineFilter;
static private var outlinefilter4:OutlineFilter;
static public function outline( output:BitmapData, source:BitmapData, rect:Rectangle, point:Point ):void{
if(! outlinefilter1 ){
outlinefilter1 = new OutlineFilter(0.125);
outlinefilter2 = new OutlineFilter(0.125,1,-1);
outlinefilter3 = new OutlineFilter(0.125,-1,-1);
outlinefilter4 = new OutlineFilter(0.125,-1,1);
}
output.applyFilter(source, rect, point, outlinefilter1 );
var b:BitmapData = new BitmapData( rect.width, rect.height, output.transparent );
var mtr:Matrix = new Matrix(1,0,0,1,point.x,point.y)
b.applyFilter(source, rect, new Point, outlinefilter2 );
output.draw( b, mtr, null, "add" )
b.applyFilter(source, rect, new Point, outlinefilter3 );
output.draw( b, mtr, null, "add" )
b.applyFilter(source, rect, new Point, outlinefilter4 );
output.draw( b, mtr, null, "add" )
}
static public function monocolor( output:BitmapData, source:BitmapData, rect:Rectangle = null, point:Point = null, rate:Number = 0.4, color:uint=0xFF000000, background:uint=0xFFFFFF ):void{
if(! rect ){ rect = source.rect; }
if(! point ){ point = new Point; }
var vec:Vector.<uint> = source.getVector( rect );
var rev:Number = 1 - rate;
rect.x = point.x;
rect.y = point.y;
var l:int = vec.length;
for ( var i:int = 0; i<l; i++ ){
var v:uint = vec[i];
var r1:int = r( v ) - r( color );
var g1:int = g( v ) - g( color );
var b1:int = b( v ) - b( color );
var r2:int = r( v ) - r( background );
var g2:int = g( v ) - g( background );
var b2:int = b( v ) - b( background );
var v1:int = (r1 < 0 ? -r1 : r1) +
(g1 < 0 ? -g1 : g1) +
(b1 < 0 ? -b1 : b1) ;
var v2:int = (r2 < 0 ? -r2 : r2) +
(g2 < 0 ? -g2 : g2) +
(b2 < 0 ? -b2 : b2) ;
vec[i] = v1*rev > v2*rate ? background : color ;
}
output.setVector( rect, vec );
}
static public function a( color:uint ):uint{ return color >>> 24 }
static public function r( color:uint ):uint{ return ( color >>> 16 ) % 0x100 }
static public function g( color:uint ):uint{ return ( color >>> 8 ) % 0x100 }
static public function b( color:uint ):uint{ return color % 0x100 }
static public function argb( a:uint, r:uint, g:uint, b:uint ):uint{ return (a<<24)+(r<<16)+(g<<8)+b }
}
import flash.filters.ConvolutionFilter;
class OutlineFilter extends ConvolutionFilter{
private var _rate:Number, _dx:Number, _dy:Number;
public function set rate(n:Number):void{ _rate=n, update()}
public function get rate():Number{ return _rate }
public function set dx(n:Number):void{ _dx=n, update()}
public function get dx():Number{ return _dx }
public function set dy(n:Number):void{ _dy=n, update()}
public function get dy():Number{ return _dy }
function OutlineFilter ( rate:Number = 1, dx:int = 1, dy:int = 1 ){
super( 3, 3, null, 1, 0, true, true, 0, 1 );
_rate = rate;
_dx = dx;
_dy = dy;
update();
}
private function update():void{
var mtr:Array = [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
var xMtr:Array = [ -1, -1, -1, 0, 0, 0, 1, 1, 1 ];
var yMtr:Array = [ -1, 0, 1, -1, 0, 1, -1, 0, 1 ];
for( var i:uint = 0; i<9; i++ ){
mtr[i] += rate * xMtr[i] * dx + rate * yMtr[i] * dy
}
matrix = mtr;
}
}
//NowLoadingライブラリ===============================================================
import flash.display.Loader;
import flash.media.Sound;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.net.URLLoader;
class NowLoading extends Sprite {
static public const COMPLETE:String = "complete";
private var loaders:Vector.<Object> = new Vector.<Object>;
private var bytesTotal:uint=0,bytesLoaded:uint=0;
private var sprite:ProgressSprite;
private var _loaderNum:uint=0, _completedNum:uint=0, _openNum:uint=0;
private var text:Bitmap;
private var onLoaded:Function;
private var LETTER:Object = {
"1":[[0,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],"2":[[1,1,1],[0,0,1],[0,1,1],[1,0,0],[1,1,1]],"3":[[1,1,1],[0,0,1],[1,1,1],[0,0,1],[1,1,1]],"4":[[1,0,1],[1,0,1],[1,0,1],[1,1,1],[0,0,1]],"5":[[1,1,1],[1,0,0],[1,1,1],[0,0,1],[1,1,1]],
"6":[[1,1,1],[1,0,0],[1,1,1],[1,0,1],[1,1,1]],"7":[[1,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]],"8":[[1,1,1],[1,0,1],[1,1,1],[1,0,1],[1,1,1]],"9":[[1,1,1],[1,0,1],[1,1,1],[0,0,1],[0,0,1]],"0":[[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]],
".":[[0],[0],[0],[0],[1]]," ":[[0],[0],[0],[0],[0]],"n":[[0,0,0],[0,0,0],[1,1,1],[1,0,1],[1,0,1]],"w":[[0,0,0,0,0],[0,0,0,0,0],[1,0,1,0,1],[1,0,1,0,1],[1,1,1,1,1]],"o":[[0,0,0],[0,0,0],[1,1,1],[1,0,1],[1,1,1]],
"a":[[0,0,0],[0,0,1],[1,1,1],[1,0,1],[1,1,1]],"l":[[1],[1],[1],[1],[1]],"i":[[1],[0],[1],[1],[1]],"d":[[0,0,1],[0,0,1],[1,1,1],[1,0,1],[1,1,1]],"g":[[0,0,0],[0,0,0],[1,1,1],[1,0,1],[1,1,1],[0,0,1],[1,1,1]],
"C":[[1,1,1],[1,0,0],[1,0,0],[1,0,0],[1,1,1]],"O":[[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]],"M":[[1,1,1,1,1],[1,0,1,0,1],[1,0,1,0,1],[1,0,1,0,1],[1,0,1,0,1]],"P":[[1,1,1],[1,0,1],[1,1,1],[1,0,0],[1,0,0]],
"T":[[1,1,1],[0,1,0],[0,1,0],[0,1,0],[0,1,0]],"L":[[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,1,1]],"E":[[1,1,1],[1,0,0],[1,1,1],[1,0,0],[1,1,1]]
}
public function NowLoading( onLoaded:Function = null, progressSprite:ProgressSprite = null ){
this.onLoaded = onLoaded;
if ( progressSprite == null ) {
sprite = new ProgressSprite();
}else{
sprite = progressSprite;
}
text = new Bitmap( new BitmapData(30 * 4, 8, true, 0x00000000 ) );
addChild(sprite).blendMode = "invert";
addChild(text).blendMode = "invert";
addEventListener( Event.ADDED_TO_STAGE, init );
}
private function init(e:Event):void{
removeEventListener( Event.ADDED_TO_STAGE, init );
with (text) {
scaleX = scaleY = 1;
x = stage.stageWidth - text.width;
y = stage.stageHeight - text.height;
}
}
public function addLoader(loader:Loader):Loader{ setListener(loader.contentLoaderInfo);_loaderNum++;return loader;}
public function addURLLoader(loader:URLLoader):URLLoader{setListener(loader); _loaderNum++; return loader;}
public function addSound(sound:Sound):Sound{setListener(sound); _loaderNum++; return sound;}
private function setListener(loader:*):void{
loader.addEventListener("open", onOpen);
loader.addEventListener("complete", onComplete);
loader.addEventListener("progress", update);
}
private function update(e:Event=null):void{
bytesLoaded=0; bytesTotal=0;
for each(var loadObj:Object in loaders){
bytesLoaded += loadObj.bytesLoaded;
bytesTotal += loadObj.bytesTotal;
};
sprite.progress( bytesLoaded/bytesTotal * _openNum / _loaderNum );
if (bytesTotal != 0) {
setText( "now loading... " + (bytesLoaded / bytesTotal * _openNum / _loaderNum * 100).toFixed(1) );
}
}
private function onOpen(e:Event):void {
e.currentTarget.removeEventListener("open", onOpen);
_openNum++;
loaders.push(e.currentTarget);
bytesTotal += e.currentTarget.bytesTotal;
}
private function onComplete(e:Event):void {
e.currentTarget.removeEventListener("complete", onComplete);
e.currentTarget.removeEventListener("progress", update);
_completedNum++;
if (_loaderNum == _completedNum) {
setText( "COMPLETE" );
if ( onLoaded != null ) { onLoaded() }
}
}
private function setText(str:String):void{
var b:BitmapData = text.bitmapData; var l:int = str.length; var position:int = b.width;
b.lock();b.fillRect(b.rect,0x000000);
for(var i:int=0;i<l;i++){
var letterData:Array = LETTER[str.substr(l-i-1,1)];position-=letterData[0].length+1;
for(var n:int=0;n<letterData.length;n++){ for(var m:int=0;m<letterData[n].length;m++){
if(letterData[n][m]==1){b.setPixel32(m+position,n+1,0xFF000000);}
} }
}
b.unlock();
}
}
class ProgressSprite extends Sprite{
public function progress(rate:Number):void {
if( stage != null ){
graphics.clear();
graphics.beginFill( 0x000000, 1 )
graphics.drawRect( 0, stage.stageHeight - 11, rate * stage.stageWidth, 11);
}
}
}
//NowLoadingライブラリここまで==============================================================