![]() |
Как правильно сложить BitmapData нужным способом?
Привет!
Есть два объекта BitmapData одинакового размера(bmp1 и bmp2). На них что то нарисовано, это может быть и картинка, не важно. Нужно получить третий объект BitmapData (bmp3) являющийся результатом сложения двух первых, с таким условием: Код:
if(bmp2.getPixel(x,y) > bmp1.getPixel(x,y))Меня интересует способ сложения BitmapData , будь то комбинация BlendMode или фильтр... или бог знает что :) Заранее спасибо за ответы! |
Отрисовать в 3 бмп дату сначало 1, потом 2... или 2, потом 1...
Отрисовывается методом draw |
методом draw будет складываться по альфаканалу, а мне нужно по цвету
т.е. если у меня Код:
color1 = 0xff0000;Код:
color3 = color2; //т.к. color2 > color1 |
грузим рисунки
http://dnadillo.dn.ua/images/imag/magna_carta_131.JPG http://dnadillo.dn.ua/images/imag/magna_carta_127.JPG в бит мапу ставим бленд моде blendMode="darken"; складываем их http://dnadillo.dn.ua/fla/in-2-1.swf http://dnadillo.dn.ua/fla/in-2-1.zip |
не помогает...
blendMode он сравнивает по каналам... а мне нужно что бы сразу по всему числу цвета... |
Если по точкам медленно, то можно по байтовому массиву. Надо уточнить, какое время обработки вас устроит.
Здесь в тесте, для двух картинок размером 2400x2400 время генерации результирующей: 2814 мс. Код:
var bmp1:BitmapData = new TestBmp1(0,0); //2400x2400 |
Цитата:
|
Цитата:
|
Цитата:
Суть такая есть два массива числовых данных, надо получить третий массив по указанному выше условию... Просто эти данные рисуются в битмап дате... так быстрее их генерить! А вот сравнивать не очень быстро... |
Хм у меня получилось получить 3й битмап где то в 4-5 раз быстрее чем через byteArray.
|
mikleb, запятые придумали, чтобы они облегчали читать текст, а не для того, чтобы их пропускать.
О логике blendMode. |
как????
|
Цитата:
Вот код Код:
Map1 - результат сравнения h,h1,h2 - вспомогательные мапы. |
mikleb, надо использовать кнопку http://www.flasher.ru/forum/images/r...ttons/edit.gif, а не создавать несколько сообщений подряд.
|
mikleb спасибо! ваш способ наиболее быстрый!
|
Цитата:
Но только тут 24битные числа, для 32 битных будет раза в два тормазнее потому что subtract не вычитает альфу, и придется дополнительно получить маски для > и >= альфы. |
да нет все нормально мне хватает 24 битных!
Вот тока не мог бы ты объяснить что это за метод такой ? Как он работает? |
Цитата:
Сперва я получил 3 маски: R от второй > чем R от первой картинки, и тоже самое для G и B, эти три маски удобно хранить в одной картинке. (там где > будет 255 а где <= будет 0). Это легко реализовать с помошью blendmode subtract. Т.е вычтаем из второй картинки первую там где вторая > будет не ноль. Ну а потом с помощью палитры все не нулевые числа(компоненты цвета) переводим в 255. Эти три маски хранятся в h1. Еще нужно получить такие же маски но только для >=. Ясно что >= это отрицание к <, поэтому делаю тоже самое только картинки меняю местами, ну и палитра инверснутая (там где было 255 делаю 0 там где было 0 делаю 255). Это будет h2. Пусть теперь надо сравнить картинки только по GB. G2B2 > G1B1 Если: G2 > G1 или G1 = G2 и B2>B1 это эквивалентно G2 > G1 или G2 >= G1 и B2>B1 Получается чтобы получить маску где GB от второй картинки больше GB от первой нужно объединить маску где G2>G1 c маской где G2>=G1 и B2>B1. Вторая маска (где G2>=G1 и B2>B1) это пересечение маски G2>=G1 и маски B2>B1. Объединение масок делается с помощью blendmode lighten (максимум) Пересечение масок делается с помощью blendmode darken (минимум). Ну вот т.е сперва перевожу маску B2>B1 в G компоненту ( c помощью copychannel) потом беру darken с маской G2>=G1 а потом беру lighten с маской где G2>G1. Дальше аналогично. |
Да оригинальный способ! Спасибо за объяснение!
|
Вобщем можно намного проще сделать, и будет быстре чем в лоб в 7-8 раз:).
|
интересно а как тут еще быстрее?
|
Вот код:
Код:
redArray[0] = 0x00000000; |
| Часовой пояс GMT +4, время: 05:11. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.