Я создаю растровый контекст, используя CGBitmapContextCreate
с опцией kCGImageAlphaPremultipliedFirst
.
Я сделал тестовое изображение 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. Здесь все данные потеряны, и я не могу определить цвет пикселя.
Как мне вообще избежать или отменить это предварительное умножение альфа-канала, чтобы я мог изменять пиксели в моем изображении на основе истинных значений пикселей R G B, какими они были при создании изображения в Photoshop? Как я могу восстановить исходные значения для R, G, B и A?
Справочная информация (вероятно, не требуется для этого вопроса):
Что я делаю, так это: я беру UIImage, рисую его в контексте растрового изображения, чтобы выполнить на нем несколько простых алгоритмов манипулирования изображениями, меняя цвет каждого пикселя в зависимости от того, какой цвет был раньше , Ничего особенного. Но мой код нуждается в реальных цветах. Когда пиксель прозрачен (то есть его альфа меньше 255), мой алгоритм не должен заботиться об этом, он должен просто изменять R, G, B по мере необходимости, в то время как Alpha остается на том же уровне. Иногда, хотя это будет сдвигать альфа вверх или вниз тоже Но я вижу их как две разные вещи. Альфа контролирует прозрачность, а R G B контролирует цвет.