Вот что я пытаюсь сделать: Слева - обычное неокрашенное изображение RGBA, которое я создал за пределами экрана и кэшировал для повышения скорости (изначально создается очень медленно, но очень быстро создается). раскрасить любым цветом позже, если потребуется). Это квадратное изображение с круговым завитком. Внутри круга изображение имеет альфа / непрозрачность 1. Вне круга оно имеет альфа / непрозрачность 0. Я отобразил его здесь внутри UIView с цветом фона [UIColor scrollViewTexturedBackgroundColor]
. Справа показано, что происходит, когда я пытаюсь раскрасить изображение, закрашивая сплошной красный прямоугольник поверх него после установки CGContextSetBlendMode(context, kCGBlendModeColor)
.
Я не этого хочу и не ожидал. Очевидно, что раскрашивание полностью прозрачного пикселя (например, значение альфа 0) по какой-то странной причине приводит к тому, что цвет заливки остается полностью включенным, а не остается прозрачным, как я ожидал.
На самом деле я хочу вот что:
Теперь, в данном конкретном случае, я могу установить область отсечения в виде круга, чтобы область за пределами круга оставалась нетронутой - и это то, что я сделал здесь в качестве обходного пути.
Но в моем приложении мне также нужно иметь возможность раскрашивать произвольные формы, где я не знаю траектории обрезки / контура. Одним из примеров является раскрашивание белого текста путем наложения градиента. Как это сделать? Я подозреваю, что должен быть какой-то способ сделать это эффективно - и, как правило, без каких-либо странных трюков с контурами / обрезкой - с использованием масок изображений ... но мне еще предстоит найти учебник по этому поводу. Очевидно, это возможно, потому что я видел текст с цветным градиентом в других играх.
Между прочим, я не могу начать с градиента и обрезать / убрать части, которые мне не нужны, потому что (как показано в примере выше) мои неокрашенные исходные изображения, как правило, имеют оттенки серого, а не чисто белые. Так что мне действительно нужно начать с неокрашенного изображения, а затем раскрасить его.
p.s. - kCGBlendModeMultiply
также имеет те же недостатки / недостатки / особенности, когда дело доходит до раскрашивания частично прозрачных изображений. Кто-нибудь знает, почему Apple решила поступить именно так? Это как если бы код раскраски Quartz обрабатывает RGBA (0,0,0,0) как RGBA (0,0,0,1), то есть полностью игнорирует и уничтожает альфа-канал.