|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Как из произвольной картинки получить только области заданного оттенка?
Столкнулся с проблемой, которую не получается пока решить самому.
Есть цветное изображение, представленное в битмапдате. Мне необходимо получить битмапдату с прозрачным (или черным фоном) и оставить на нем только те элементы изображения, которые с некоторой заданной степенью имеют необходимый оттенок, например, зеленый. В простом случае я могу сравнивать компоненты цвета каждого пикселя с искомыми компонентами, но это слишком затратно. Я пытался с помощью BitmapData.threshold дважды "пройтись" по изображению (создавая две новые битмапдаты), сначала "отрезая" ниже порога, а во второй "отрезая" выше. Но получается ерунда. Кто-нибудь может подсказать, в каком направлении двигаться?
__________________
hauts.ru |
|
|||||
Регистрация: Nov 2009
Сообщений: 176
|
по типу этого? http://silin.su/#AS3/bitmap/bucket/bin
|
|
|||||
>> пытался с помощью BitmapData.threshold дважды "пройтись" по изображению ..
фишка в том, что анализировать надо покомпонентно и threshold'ом такое не взять есть такой финт с отрисовкой разницы (BlendMode.DIFFERENCE), усреднением каналов и тогда уже threshold'ом.. насколько это точно по всяким цветовым понятиям не берусь судить, но на глаз похоже 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); } } |
Часовой пояс GMT +4, время: 01:18. |
|
« Предыдущая тема | Следующая тема » |
|
|