Можно ли рисовать на отдельных каналах с Core Graphics? - PullRequest
1 голос
/ 02 июля 2019

Я хотел бы рисовать в определенных каналах, используя Core Graphics.

Используя приведенный ниже код, каждая фигура рисуется с использованием одного цвета канала, но второй прямоугольник, заполненный зеленым, заменит предыдущий красный эллипс.Я бы хотел, чтобы один эллипс был только в красном канале, а квадрат - только в зеленом.Я пытался использовать прозрачные слои, но они не помогли.

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
let context = UIGraphicsGetCurrentContext()!
let circlePath = UIBezierPath(ovalIn: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50))
let squarePath = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50))

UIColor.red.setFill()
circlePath.fill()

UIColor.green.setFill()
squarePath.fill()

Можно ли рисовать в отдельных каналах?Или мне придется рисовать отдельные растровые изображения и комбинировать их на уровне пикселей?

1 Ответ

0 голосов
/ 07 июля 2019

Вместо использования UIBezierPath.fill() (который рисует путь Безье как полностью непрозрачный), вам нужно использовать fill(with:alpha:), который позволяет вам указать пользовательскую непрозрачность как CGFloat между 0 (полностью прозрачный) и 1 (полностью непрозрачный).

Доступно несколько режимов наложения (см. CGBlendMode), которые определяют, как частично прозрачные поверхности взаимодействуют друг с другом. Умножение - это «разумное значение по умолчанию», но вы можете поиграть с ними и посмотреть, какой из них лучше всего соответствует вашему дизайну. Режимы наложения такие же, как в Photoshop и т. Д., Поэтому существует множество онлайн-уроков, объяснений и примеров, таких как https://photoshoptrainingchannel.com/blending-modes-explained/

...