|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
как????
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
Регистрация: Feb 2008
Сообщений: 111
|
Через бленд моды
Вот код Map1 = new BitmapData(Cmp1Map.width, Cmp1Map.height); h1 = new BitmapData(Cmp1Map.width, Cmp1Map.height); h2 = new BitmapData(Cmp1Map.width, Cmp1Map.height); h = new BitmapData(Cmp1Map.width, Cmp1Map.height); var redArray:Array = new Array(256); var greenArray:Array = new Array(256); var blueArray:Array = new Array(256); var redArray2:Array = new Array(256); var greenArray2:Array = new Array(256); var blueArray2:Array = new Array(256); redArray[0] = 0x00000000; greenArray[0] = 0x00000000; blueArray[0] = 0x00000000; redArray2[0] = 0x00FF0000; greenArray2[0] = 0x0000FF00; blueArray2[0] = 0x000000FF; for (i = 1; i <= 255; i++) { redArray[i] = 0x00FF0000; greenArray[i] = 0x0000FF00; blueArray[i] = 0x000000FF; redArray2[i] = 0x00000000; greenArray2[i] = 0x00000000; blueArray2[i] = 0x00000000; } t = getTimer(); h1.copyPixels(Cmp2Map, new Rectangle (0,0,h1.width,h1.height),new Point(0,0)); h1.draw (Cmp1Map, null, null, "subtract"); h1.paletteMap(h1, new Rectangle (0, 0, h1.width, h1.height), new Point(0, 0), redArray, greenArray, blueArray); h2.copyPixels(Cmp1Map, new Rectangle (0,0,h2.width,h2.height),new Point(0,0)); h2.draw (Cmp2Map, null, null, "subtract"); h2.paletteMap(h2, new Rectangle (0, 0, h2.width, h2.height), new Point(0, 0), redArray2, greenArray2, blueArray2); h.copyChannel(h1, new Rectangle (0, 0, h1.width, h1.height), new Point (0, 0), BitmapDataChannel.BLUE, BitmapDataChannel.GREEN); h.draw(h2, null, null, "darken"); h.draw(h1, null, null, "lighten"); h.copyChannel(h, new Rectangle (0, 0, h.width, h.height), new Point (0, 0), BitmapDataChannel.GREEN, BitmapDataChannel.RED); h.draw(h2, null, null, "darken"); h.draw(h1, null, null, "lighten"); h.copyChannel(h, new Rectangle (0, 0, h.width, h.height), new Point (0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA); Map1 = Cmp1Map.clone(); Map1.copyPixels(Cmp2Map, new Rectangle (0, 0, h.width, h.height), new Point (0, 0), h, null, true); trace (getTimer() - t); Map1 - результат сравнения h,h1,h2 - вспомогательные мапы. Последний раз редактировалось mikleb; 09.06.2008 в 15:51. |
|
|||||
mikleb спасибо! ваш способ наиболее быстрый!
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
Регистрация: Feb 2008
Сообщений: 111
|
Незачто
Но только тут 24битные числа, для 32 битных будет раза в два тормазнее потому что subtract не вычитает альфу, и придется дополнительно получить маски для > и >= альфы. |
|
|||||
да нет все нормально мне хватает 24 битных!
Вот тока не мог бы ты объяснить что это за метод такой ? Как он работает?
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
Регистрация: Feb 2008
Сообщений: 111
|
Цитата:
Сперва я получил 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. Дальше аналогично. Последний раз редактировалось mikleb; 10.06.2008 в 15:39. |
|
|||||
Да оригинальный способ! Спасибо за объяснение!
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
Регистрация: Feb 2008
Сообщений: 111
|
Вобщем можно намного проще сделать, и будет быстре чем в лоб в 7-8 раз.
Последний раз редактировалось mikleb; 12.06.2008 в 21:18. |
Часовой пояс GMT +4, время: 01:08. |
|
« Предыдущая тема | Следующая тема » |
|
|