Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как из произвольной картинки получить только области заданного оттенка? (http://www.flasher.ru/forum/showthread.php?t=184714)

Hauts 25.09.2012 14:46

Как из произвольной картинки получить только области заданного оттенка?
 
Столкнулся с проблемой, которую не получается пока решить самому.

Есть цветное изображение, представленное в битмапдате. Мне необходимо получить битмапдату с прозрачным (или черным фоном) и оставить на нем только те элементы изображения, которые с некоторой заданной степенью имеют необходимый оттенок, например, зеленый.

В простом случае я могу сравнивать компоненты цвета каждого пикселя с искомыми компонентами, но это слишком затратно.

Я пытался с помощью BitmapData.threshold дважды "пройтись" по изображению (создавая две новые битмапдаты), сначала "отрезая" ниже порога, а во второй "отрезая" выше. Но получается ерунда.

Кто-нибудь может подсказать, в каком направлении двигаться?

caseyryan 25.09.2012 15:05

по-моему даже фотошоп это нормально сделать не может

Hauts 25.09.2012 17:39

Мне хотя бы до уровня фотошопа, "select color" :)

Wadimir 25.09.2012 18:20

по типу этого? http://silin.su/#AS3/bitmap/bucket/bin

КорДум 25.09.2012 19:15

Вложений: 1
Шейдер? У меня есть шейдер хромакея, он убивает заданный цвет. Думаю, если глянуть его реализацию, не составит труда сделать обратное.

silin 25.09.2012 19:50

>> пытался с помощью 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);
        }
}


Hauts 25.09.2012 20:02

Спасибо большое, буду разбираться!

alatar 27.09.2012 14:22

Цитата:

Сообщение от silin (Сообщение 1097395)
...есть такой финт с отрисовкой разницы (BlendMode.DIFFERENCE)...

Это не тоже самое, что вызвать compare()?

silin 27.09.2012 18:44

compare просто минусует, а BlendMode.DIFFERENCE дает разницу между более светлым и более темным
т.е. для 0xFFFFFF будет тоже самое, для других - как получится


Часовой пояс GMT +4, время: 18:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.