, Для быстрой 4:

ользуюCISourceOverCompositing чтобы наложить текст поверх изображения, и я получаю неожиданные результаты, когда текстовое изображение не является полностью непрозрачным. Темные цвета не достаточно темные, а светлые цвета слишком светлые в выходном изображении.

Я воссоздал проблему впростой проект Xcode, Он создает изображение с оранжевым, белым, черным текстом, нарисованным с точностью до 0,3 альфа, и это выглядит правильно. Я даже бросил это изображение в Sketch, поместив его поверх фонового изображения, и оно выглядит великолепно. Изображение внизу экрана показывает, как это выглядит в Sketch. Проблема в том, что после наложения текста на фон с помощьюCISourceOverCompositingбелый текст слишком непрозрачен, как если бы альфа был 0,5, а черный текст едва различим, как если бы альфа был 0,1. Верхнее изображение показывает это программно созданное изображение. Вы можете перетащить ползунок, чтобы настроить альфа (по умолчанию 0,3), который воссоздает полученное изображение.

Код включен в проект, конечно, но также включен здесь. Это создает текстовое наложение с 0,3 альфа, которое выглядит как ожидалось.

let colorSpace = CGColorSpaceCreateDeviceRGB()
let alphaInfo = CGImageAlphaInfo.premultipliedLast.rawValue

let bitmapContext = CGContext(data: nil, width: Int(imageRect.width), height: Int(imageRect.height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: alphaInfo)!
bitmapContext.setAlpha(0.3)
bitmapContext.setTextDrawingMode(CGTextDrawingMode.fill)
bitmapContext.textPosition = CGPoint(x: 20, y: 20)

let displayLineTextWhite = CTLineCreateWithAttributedString(NSAttributedString(string: "hello world", attributes: [.foregroundColor: UIColor.white, .font: UIFont.systemFont(ofSize: 50)]))
CTLineDraw(displayLineTextWhite, bitmapContext)

let textCGImage = bitmapContext.makeImage()!
let textImage = CIImage(cgImage: textCGImage)

Затем это текстовое изображение накладывается поверх фонового изображения, которое выглядит не так, как ожидалось.

let combinedFilter = CIFilter(name: "CISourceOverCompositing")!
combinedFilter.setValue(textImage, forKey: "inputImage")
combinedFilter.setValue(backgroundImage, forKey: "inputBackgroundImage")
let outputImage = combinedFilter.outputImage!

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

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