El filtro de imagen principal CISourceOverCompositing no aparece como se esperaba con la superposición alfa

Estoy usandoCISourceOverCompositing superponer texto sobre una imagen y obtengo resultados inesperados cuando la imagen de texto no es completamente opaca. Los colores oscuros no son lo suficientemente oscuros y los colores claros son demasiado claros en la imagen de salida.

Recreé el problema en unproyecto Xcode simple. Crea una imagen con texto naranja, blanco y negro dibujado con 0.3 alfa, y eso se ve correcto. Incluso arrojé esa imagen en Sketch colocándola encima de la imagen de fondo y se ve muy bien. La imagen en la parte inferior de la pantalla muestra cómo se ve eso en Sketch. El problema es que, después de superponer el texto en el fondo usandoCISourceOverCompositing, el texto blanco es demasiado opaco como si el alfa fuera 0.5 y el texto negro apenas es visible como si el alfa fuera 0.1. La imagen superior muestra esa imagen creada mediante programación. Puede arrastrar el control deslizante para ajustar el alfa (predeterminado en 0.3) que recreará la imagen resultante.

El código se incluye en el proyecto, por supuesto, pero también se incluye aquí. Esto crea la superposición de texto con 0.3 alfa, que aparece como se esperaba.

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)

A continuación, esa imagen de texto se superpone sobre la imagen de fondo, que no aparece como se esperaba.

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta