|
|
|||||
инвертировать альфа канал
Нужно из прозрачных мест сделать не прозрачные, а непрозрачные прозрачными.
alpha = 255 - alpha Делаю так, но уверен, что есть более быстрый метод, подскажите пожалуйста: var data:BitmapDate = ... invert_date = new BitmapData(date.width, date.height, true, 0x00000000); var r:Rectangle = new Rectangle(0, 0, date.width, date.height); var byte:ByteArray = date.getPixels(r); var new_byte:ByteArray = new ByteArray(); byte.position = 0; for (var i:uint = byte.length / 4; i > 0; i--) { var hex:int = byte.readInt() var alpha:uint = 0xFF - (hex >> 24 & 0xFF); hex &= 0x00FFFFFF; hex |= alpha << 24; new_byte.writeInt(hex); } new_byte.position = 0; invert_date.setPixels(r, new_byte); |
|
|||||
Modus ponens
|
Я не уверен... но, просто для эксперимента - а что будет если через copyChannel скопировать только альфаканал, инвертировать только его, а потом вернуть на место?
Из разряда общей оптимизации: а / 4 == а * 0.25 == a >>> 2 в вашей ситуации лучше было бы закешировать длинну массива (т.как она не меняется) и сразу поделить на 4 вместо того, чтобы делать это каждую итерацию. (Имеется в виду - инкрементить i в цикле, а не декрементить - инкремент быстрее). А, да, и инкремент с int быстрее инкремента с uint - почему - это загадка AVM2
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.12.2009 в 18:12. |
|
|||||
С делением, и вправду, можно выкинуть одну здоровенную спичку из коробка, а вот про инкремент и декремент не знал...
Для использования copyChannel нужен еще один BitmapDate, в который придется загнать этот канал, вообщем, я что-то не смог придумать, как его прикрутить. |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
Инвертирование альфа-канала - это alpha^=0xff000000, а не вся эта куча операций.
|
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Цитата:
|
|
|||||
И так, получилось:
var data:BitmapDate = ... invert_date = new BitmapData(date.width, date.height, true, 0x00000000); var r:Rectangle = new Rectangle(0, 0, date.width, date.height); var byte:ByteArray = date.getPixels(r); var new_byte:ByteArray = new ByteArray(); byte.position = 0; var length:int = byte.length >> 2; // == byte.length / 4 for (var i:int = 0; i < length; i++) { new_byte.writeInt(byte.readInt() ^ 0xFF000000); } new_byte.position = 0; invert_date.setPixels(r, new_byte); |
|
|||||
Modus ponens
|
Цитата:
или вместо:
__________________
Hell is the possibility of sanity |
|
|||||
alpha = 255 - alpha
|
Часовой пояс GMT +4, время: 14:38. |
|
« Предыдущая тема | Следующая тема » |
|
|