Обратите внимание, что этот подход не восстановит информацию, «потерянную», когда исходный неумноженный пиксель был предварительно умножен. Но он возвращает наименьший не умноженный пиксель, который станет предварительно умноженным пикселем, когда снова пройдет логику предварительного умножения. Это полезно, когда графическая подсистема принимает только предварительно умноженные пиксели (как CoreGraphics в OSX). Если графическая подсистема принимает только предварительно умноженные пиксели, то лучше хранить только предварительно умноженные пиксели, поскольку потребляется меньше места по сравнению с неумноженными пикселями.

даю растровый контекст, используяCGBitmapContextCreate сkCGImageAlphaPremultipliedFirst вариант.

Я сделал тестовое изображение 5х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 контролирует цвет.

Ответы на вопрос(1)

Ваш ответ на вопрос