|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Oct 2015
Сообщений: 4
|
заменить медленный setPixel32
Добрый день!
Мне нужно заменить "преобладающий" цвет из RGB на прозрачный. например для удаления зеленого цвета я делаю так: sourceBmdSmall.lock(); for (var i:uint = 0; i < sourceBmdSmall.width; i++) for (var j :uint = 0; j < sourceBmdSmall.height ; j++) { var color:uint = sourceBmdSmall.getPixel(i, j); var rgb:Object = ColorUtil.getRGB(color); var maxColor:uint = rgb.r > rgb.b ? rgb.r : rgb.b; if (rgb.g > maxColor + 7) // число 7 - некий порог с которым нужно удалить цвет sourceBmdSmall.setPixel32(i, j, 0x00000000); } sourceBmdSmall.unlock(); Алгоритм очень простой и очень хорошо работает в моем случае...где нужно прям вообще все преобладающие цвета из RGB удалить (красный зеленый или синий). К сожалению на больших картинках подтормаживает( Можно ли этот вариант сделать каким то другим способом? Например через тот же threshold? Что то ни как не соображу.. Кстати говоря до этого удалял цвет как раз с помощью threshold, но работает все таки не так хорошо как в коде выше. Либо я не допонял возомжности threshold. |
|
|||||
Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
|
Добрый день. Не думая, навскидку:
должно работать в разы быстрее Последний раз редактировалось nuToH; 13.10.2015 в 17:49. |
|
|||||
Регистрация: Oct 2015
Сообщений: 4
|
Спасибо за ответ!
Первый вариант по скорости работает примерно как мой...ускорения не заметно никакого. а по второму не очень понял. В своем примере я показал как убираю зеленый цвет. и очень близкие к зеленому цвета. например в моем случае варианты цветов: 100 108 100 0 108 100 0 208 200 200 208 0 будут считаться близкими к зеленому с порогом 7. (if (rgb.g > maxColor + 7)) И вот этот вариант максимально хорошо работает..но медленный зараза) |
|
|||||
Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
|
Прошу прощения, поспешил.
|
|
|||||
Регистрация: Oct 2015
Сообщений: 4
|
Исправил на такой вариант:
for (i = 0; i < length; i++) { if ((vector[i] >> 8 & 0xFF) > Math.max(vector[i] >> 16 & 0xFF, vector[i] & 0xFF) + 7) vector[i] = 0; } Но если еще есть варианты я послушаю) |
|
|||||
Точно нужно только один раз читать из вектора + заменить Math.max на самописную, типа такого:
for (i = 0; i < length; i++) { var elem:uint = vector[i]; // одно чтение из вектора var a:uint = elem >> 16 & 0xFF; var b:uint = elem & 0xFF; var max:uint = a > b ? a : b; // самописная проверка if ((elem >> 8 & 0xFF) > max + 7) { vector[i] = 0; } } а) индексный доступ к массивам в AS3 довольно медленный б) Math.max - это статический метод, в AS3 это тоже очень и очен медленно работает
__________________
...вселенская грусть |
|
|||||
Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
|
var width:int = sourceBmdSmall.width; var height:int = sourceBmdSmall.height; var rect:Rectangle = sourceBmdSmall.rect; var point:Point = new Point(); var greenChannel:BitmapData = new BitmapData( width, height, false, 0xFFFFFFFF ); greenChannel.copyChannel( sourceBmdSmall, sourceBmdSmall.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.RED ); greenChannel.copyChannel( sourceBmdSmall, sourceBmdSmall.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN ); greenChannel.copyChannel( sourceBmdSmall, sourceBmdSmall.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.BLUE ); // 0xGGGGGG var a:BitmapData = sourceBmdSmall.clone(); a.draw( greenChannel, null, null, BlendMode.LIGHTEN ); // a = max( src, 0xGGGGGG ) a = a.compare( sourceBmdSmall ) as BitmapData; // a = a - source var b:BitmapData = new BitmapData( width, height, false, 0 ); b.threshold( a, rect, point, ">", 0x070000, 0xFFFF0000, 0xFF0000 ); // g - r > 7 var c:BitmapData = new BitmapData( width, height, false, 0 ); c.threshold( a, rect, point, ">", 0x000007, 0xFFFF0000, 0xFF0000 ); // g - b > 7 b.merge( c, rect, point, 128, 128, 128, 128 ); // f0.5 * 0xFF0000 + f0.5* 0xFF0000 == 0xFF0000 sourceBmdSmall.threshold( b, rect, point, "==", 0xFF0000, 0x00000000, 0x00FF0000 ); // 0xFF00FF ? 0x00000000 : dst |
|
|||||
Попробуйте PixelBender, замечательно справлялся с задачей (там же есть скрин с готовым кодом, вам нужно будет только сменить "<" на ">" в условии.
Правда, говорят сейчас он тормозит... Но попробывать стоит. Еще можно через воркер
__________________
return this... Последний раз редактировалось AlexCooper; 14.10.2015 в 01:49. |
|
|||||
Регистрация: Oct 2015
Сообщений: 4
|
всем спасибо!
|
|
|||||
а это не канает уже?
http://help.adobe.com/ru_RU/FlashPla...hreshold%28%29
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
Часовой пояс GMT +4, время: 18:04. |
|
« Предыдущая тема | Следующая тема » |
|
|