In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 色の距離

なんとなく
左側画像をクリックしてください。
* クリックしたピクセルと同じような色を探して表示します。
* 
* RGBを距離として捉える考え方です。
* 白に変換された部分は距離が遠い、つまり似た色ではないと判断できます。
* 
* 閾値は下のスライダーで調整可能です。
Get Adobe Flash player
by uwi 19 Dec 2009
    Embed
// forked from rsakane's 色の距離
// なんとなく
/*
 * 左側画像をクリックしてください。
 * クリックしたピクセルと同じような色を探して表示します。
 * 
 * RGBを距離として捉える考え方です。
 * 白に変換された部分は距離が遠い、つまり似た色ではないと判断できます。
 * 
 * 閾値は下のスライダーで調整可能です。
 */
package
{
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.system.Security;
	import frocessing.color.ColorHSV;
	import com.bit101.components.HUISlider;
	import com.bit101.components.Panel;
 
	public class Main extends Sprite
	{
		private const WIDTH:int = 232;
		private const HEIGHT:int = 232;
		
		private var bitmapA:Bitmap;
		private var bitmapB:Bitmap;
		private var bd:BitmapData;
		
		private var slider:HUISlider;
		private var panel:Panel;
 
		public function Main()
		{
			panel = new Panel(this);
			panel.width = panel.height = 465;
			
			Security.loadPolicyFile("http://farm3.static.flickr.com/crossdomain.xml");
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
			loader.load(new URLRequest("http://farm3.static.flickr.com/2133/1991035050_f169d55a13.jpg"), new LoaderContext(true));
		}
 
		private function initHandler(event:Event):void
		{
			var loader:Loader = event.currentTarget.loader;
 
			var matrix:Matrix = new Matrix();
			matrix.scale(WIDTH / loader.width, HEIGHT / loader.height);
 
			bd = new BitmapData(WIDTH, HEIGHT);
			bd.draw(loader, matrix);
			
			bitmapA = new Bitmap(bd);
			panel.content.addChild(bitmapA);
			var destbd:BitmapData = bd.clone();
			bitmapB = new Bitmap(destbd);
			bitmapB.x = WIDTH + 1;
			panel.content.addChild(bitmapB);
			
			slider = new HUISlider(this, 5, 300, "distance");
			slider.value = 60;
			slider.minimum = 10;

                        _temp = bitmapA.bitmapData.clone();
			
			stage.addEventListener(MouseEvent.CLICK, onMouseClick);
		}
		
		private function onMouseClick(event:MouseEvent):void
		{
			if (!bitmapA.hitTestPoint(mouseX, mouseY)) return;
			bitmapB.bitmapData = bd.clone();
			search(bd.getPixel(mouseX, mouseY));
		}

                private var _temp : BitmapData;
		
		private function search(c:int):void
		{
			var colorA:ColorHSV = new ColorHSV();
			var colorB:ColorHSV = new ColorHSV();
			colorA.value = c;

                        var i:uint;
                        var rs:Array = new Array(256);
                        var gs:Array = new Array(256);
                        var bs:Array = new Array(256);
                        for(i = 0;i < 256;i++){
                            rs[i] = (colorA.r - i) * (colorA.r - i);
                            gs[i] = (colorA.g - i) * (colorA.g - i);
                            bs[i] = (colorA.b - i) * (colorA.b - i);
                        }
                        _temp.paletteMap(bd, bd.rect, new Point(), rs, gs, bs);
			
                        var bmd:BitmapData = bitmapB.bitmapData;
                        bmd.lock();
                        bmd.copyPixels(bd, bd.rect, new Point());
                        bmd.threshold(_temp, _temp.rect, new Point(), ">", slider.value * slider.value, 0xffffff, 0xffffff);
                        bmd.unlock();
		}
	}
}