Как получить реальные значения цветов RGBA или ARGB без предварительного умножения альфа-канала?

Я создаю контекст растрового изображения, используя CGBitmapContextCreate с ] kCGImageAlphaPremultipliedFirst option.

Я сделал тестовое изображение 5 x 5 с некоторыми основными цветами (чистый красный, зеленый, синий, белый, черный), несколькими смешанными цветами (например, фиолетовым) в сочетании с некоторыми альфа-вариациями. Каждый раз, когда альфа-компонент не равен 255, значение цвета неверно.

Я обнаружил, что могу пересчитать цвет, когда делаю что-то вроде:

almostCorrectRed = wrongRed * (255 / alphaValue);
almostCorrectGreen = wrongGreen * (255 / alphaValue);
almostCorrectBlue = wrongBlue * (255 / alphaValue);

Но проблема в том, что мои вычисления иногда не соответствуют 3 или даже больше. Так, например, я получаю значение 242 вместо 245 для зеленого, и я на 100% уверен, что оно должно быть ровно 245. Альфа равна 128.

Затем для того же цвета, только с другой непрозрачностью альфа в PNG растровое изображение, я получаю альфа = 255 и зеленый = 245, как и должно быть.

Если альфа равно 0, то красный, зеленый и синий также равны 0. Здесь все данные потеряны, и я не могу определить цвет

Как я могу полностью избежать или отменить это предварительное умножение альфа-канала, чтобы я мог изменять пиксели в моем изображении на основе истинных значений пикселей RGB, какими они были при создании изображения в Photoshop? Как мне восстановить исходные значения для R, G, B и A?


Справочная информация (вероятно, не требуется для этого вопроса):

Я делаю следующее: я беру UIImage, рисую его в контекст растрового изображения, чтобы выполнить на нем несколько простых алгоритмов обработки изображения, смещая цвет каждого пикселя в зависимости от того, каким он был раньше. Ничего особенного. Но моему коду нужны настоящие цвета. Когда пиксель прозрачен (то есть у него альфа меньше 255), мой алгоритм не должен заботиться об этом, он должен просто изменять R, G, B по мере необходимости, в то время как альфа остается неизменной. Иногда даже альфа сдвигается вверх или вниз. Но я рассматриваю их как две разные вещи. Альфа контролирует прозрачность, а RGB контролирует цвет.

6
задан Proud Member 18 June 2011 в 12:52
поделиться