Показать сообщение отдельно
Старый 25.09.2012, 19:50
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>> пытался с помощью BitmapData.threshold дважды "пройтись" по изображению ..
фишка в том, что анализировать надо покомпонентно и threshold'ом такое не взять
есть такой финт с отрисовкой разницы (BlendMode.DIFFERENCE), усреднением каналов и тогда уже threshold'ом..
насколько это точно по всяким цветовым понятиям не берусь судить, но на глаз похоже
Код AS3:
public class Main extends Sprite
{
	[Embed(source="img.jpg")]
	private var imgClass:Class;
 
	public function Main():void
	{
		stage.scaleMode = StageScaleMode.NO_SCALE;
		var src:Bitmap = new imgClass() as Bitmap;
 
		var clr:uint = 0xFF0000;
		var tol:int = 80;
 
		//разница между оригиналом и цветом
		var clrBmd:BitmapData = new BitmapData(src.width, src.height, false, clr);
		clrBmd.draw(src, null, null, BlendMode.DIFFERENCE);
 
		//загоняем все каналы в синий
		var k:Number = 1 / 3;
		var mtrx:Array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, k, k, k, 0, 0, 0, 0, 0, 0, 0];
		var filter:ColorMatrixFilter = new ColorMatrixFilter(mtrx);
		clrBmd.applyFilter(clrBmd, clrBmd.rect, new Point(), filter);
 
		// отсекаем, что не попадает в точность
		var resBmd:BitmapData = src.bitmapData.clone();
		resBmd.threshold(clrBmd, clrBmd.rect, new Point, ">", tol, 0x0, 0xFF);
 
		var res:Bitmap = new Bitmap(resBmd);
		res.y = src.height;
 
		addChild(src);
		addChild(res);
	}
}