Умножение цветов при компоновке с кварцем - PullRequest
2 голосов
/ 17 июня 2011

Я пытаюсь нарисовать изображение определенного цвета. Чтобы получить этот эффект, сначала я рисую изображение (состоящее в основном из белого и черного), а затем рисую над ним прямоугольник указанного цвета (скажем, красного). Доступны различные варианты композитинга, но ни один из них не является именно тем, что я хочу.

Я хочу, чтобы цвета (и альфа-значения) были умножены вместе. Я думаю, что это иногда называют «модуляцией» операции в других графических системах. Таким образом, значения белого в изображении будут умножены на значения красного в прямоугольнике наложения, чтобы получить красный цвет. Значения черного на изображении будут умножены с черного на черный продукт.

Другими словами, R = S * D (результат равен источнику, умноженному на пункт назначения).

Это код, с которым я сейчас работаю:

[image drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];

NSColor * blend = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1.0];

[blend setFill];
NSRectFillUsingOperation(self.bounds, NSCompositePlusDarker);

NSCompositePlusDarker - это НЕ то, что я хочу, но оно близко. (Это сложение вместо умножения).

Есть ли способ сделать это в Кварце? Это очень легко сделать в OpenGL, например. Я посмотрел на CIFilter's, но они кажутся немного громоздкими для этого. Но если это единственный способ, я буду признателен за любой пример кода, который поможет мне в правильном направлении.

1 Ответ

2 голосов
/ 17 июня 2011

Да.

Обратите внимание, что операции компоновки AppKit и режимы наложения Quartz, хотя их довольно много, не являются взаимозаменяемыми.kCGBlendModeMultiply имеет то же числовое значение, что и NSCompositeCopy, поэтому последнее - плоская перезапись - это то, что произойдет, если вы попытаетесь передать его любому из API рисования AppKit.

Итак, вам нужноиспользуйте Кварц для каждой части заполнения.Вы можете использовать NSGraphicsContext до , чтобы получить CGContext , который вам понадобится, и вы можете запросить у своего NSColor его CGColor.

...