forked from: 色の距離
なんとなく
左側画像をクリックしてください。
* クリックしたピクセルと同じような色を探して表示します。
*
* RGBを距離として捉える考え方です。
* 白に変換された部分は距離が遠い、つまり似た色ではないと判断できます。
*
* 閾値は下のスライダーで調整可能です。
// 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();
}
}
}