Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Некорректная работа copyChannel() (http://www.flasher.ru/forum/showthread.php?t=213975)

Gasoline 11.03.2017 19:00

Некорректная работа copyChannel()
 
Имеется код
Код AS3:

// берем картинку из библиотеки
var bg:myImage = new myImage(800, 600);
// пытаемся изменить альфу путем присвоения ей значения красного канала
bg.copyChannel(bg, new Rectangle(0,0,800, 600), new Point (0,0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
var myPicture:Bitmap = new Bitmap(bg);
addChild(myPicture);

Всё работает, если картинка имеет прозрачность, для остальных картинок альфа не изменится, останется значение 0xFF.
Можно написать так:
Код AS3:

var bg:myImage = new myImage(800, 600);
//создаем новую битмапдату
var temp:BitmapData = new BitmapData(800, 600);
// копируем все каналы из нашей картинки в новую битмапдату
temp.copyChannel(bg, new Rectangle(0,0,800, 600), new Point (0,0), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE)
temp.copyChannel(bg, new Rectangle(0,0,800, 600), new Point (0,0), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN);
temp.copyChannel(bg, new Rectangle(0,0,800, 600), new Point (0,0), BitmapDataChannel.RED, BitmapDataChannel.RED);
// и уже теперь меняем альфу
temp.copyChannel(bg, new Rectangle(0,0,800, 600), new Point (0,0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
var myPicture:Bitmap = new Bitmap(temp);
addChild(myPicture);

Код работает, наша альфа меняется. Вот только логично предположить, что альфа канал должен иметь такое же значение, что и канал красного, но значения отличаются (не критично от 0 до двух), с другими каналами такого не наблюдается.
И собственно вопросы, почему так получается, и есть ли более элегантное решение?

Zebestov 11.03.2017 21:00

Цитата:

Сообщение от Gasoline (Сообщение 1199680)
…но значения отличаются (не критично от 0 до двух)

Как это понимать?

Gasoline 11.03.2017 21:13

Код AS3:

trace((temp.getPixel32(100, 100)).toString(16)); // d3d39c87 (канал альфа соответствует значению красного канала  = d3)
trace((temp.getPixel32(100, 150)).toString(16));//dad9a09b (значение альфа канала больше на единицу)

Если взять, например, такую картинку
то
Код AS3:

for (var i=0; i< 600; i+=20) {
        trace((temp.getPixel32(0, i)).toString(16));
}

выдаст

callme 11.03.2017 23:23

Происходит потеря данных

Например третья снизу строка в твоем логе.

Было значение
12121212

Умножаем каналы на альфу, получим
12010101

Разумножаем обратно, получим
120e0e0e

http://help.adobe.com/ru_RU/FlashPla...l#getPixel32()

Цитата:

Все пиксели в объекте BitmapData сохраняются как предварительно умноженные значения цвета. В предварительно умноженном пикселе изображения значения красного, зеленого и синего канала уже умножены на данные альфа-канала. Например, если значение альфа-канала равно нулю, то значения RGB-каналов также равны нулю независимо от их значений до умножения. Потеря данных может вызвать проблемы при выполнении операций. Все методы BitmapData принимают и возвращают неумноженные значения. Перед тем как возвращать значение, внутреннее представление пикселя преобразуется из предварительно умноженного в неумноженное

Gasoline 11.03.2017 23:59

Цитата:

Происходит потеря данных
Спасибо. Теперь понятно.
А можно к изображению прибавить альфа канал (установить значение transparent как true ), а то мне моё решение кажется громоздким.

Zebestov 12.03.2017 01:03

Можно три первых copyChannel() заменить на один copyPixels().


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

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