forked from: forked from: 点描風
forked from forked from: 点描風 (diff: 29)
軽量・高速化。 うまく合成するBlendModeがなかったのでアルファはなくして上書き。
ActionScript3 source code
/**
* Copyright uwi ( http://wonderfl.net/user/uwi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1DKM
*/
// forked from uwi's forked from: 点描風
// forked from moringo2's 点描風
// 軽量・高速化。
// うまく合成するBlendModeがなかったのでアルファはなくして上書き。
package{
//コードは書き殴った感じで、きれいではないですけど。。
import flash.display.*;
import flash.net.*
import flash.events.Event;
import flash.geom.*;
import flash.system.LoaderContext;
public class IMTest extends Sprite{
private const imgPaths:Array = ["http://moringo.moo.jp/out/b01.jpg","http://moringo.moo.jp/out/b02.jpg",
"http://moringo.moo.jp/out/b03.jpg","http://moringo.moo.jp/out/b04.jpg",
"http://moringo.moo.jp/out/b05.jpg"];
private var canvas:Bitmap;
private var bm:Bitmap;
private var bmd:BitmapData;
private var counter:int = 0;
private var loader:Loader;
public function IMTest(){
init();
}
private function init() : void{
counter = 0;
loader = new Loader();
loader.load(new URLRequest(imgPaths[Math.floor(Math.random()*5)]),new LoaderContext(true));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,comp);
}
private function comp(e:Event) : void{
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,comp);
bm = loader.content as Bitmap;
bmd = bm.bitmapData;
addEventListener(Event.ENTER_FRAME,drawCircle);
var cbmd : BitmapData = new BitmapData(bmd.width, bmd.height, false, 0x000000);
canvas = new Bitmap(cbmd);
addChild(canvas);
}
private function drawCircle(e:Event) : void{
canvas.bitmapData.lock();
for(var i:int=0; i<100; i++){
var range : int = Math.random() * 5 + 1;
var rr : int = 2 * range + 1;
var randX:int = Math.random() * bmd.width;
var randY:int = Math.random() * bmd.height;
// 平均色を計算。intersectionをとっておかないとクラッシュする。
var rect : Rectangle = new Rectangle(randX - range, randY - range, rr, rr).intersection(bmd.rect);
var hist : Vector.<Vector.<Number>> = bmd.histogram(rect);
var avgColor : uint = 0;
for(var k : uint = 0;k <= 2;k++){
var vec : Vector.<Number> = hist[k];
var sum : Number = 0;
var num : uint = 0;
for(var j : uint = 0;j < vec.length;j++){
sum += j * vec[j];
num += vec[j];
}
if(num == 0)num = 1;
avgColor = avgColor << 8 | uint(sum / num);
}
canvas.bitmapData.fillRect(rect, avgColor);
}
canvas.bitmapData.unlock();
counter++;
if(counter >= 250){
removeEventListener(Event.ENTER_FRAME,drawCircle);
loader = null;
removeChild(canvas);
canvas = null;
bm = null;
bmd = null;
init();
}else{
}
}
}
}