Tenho a seguinte imagem de origem:
Estou tentando convertê-lo para:
Eu construí este código:
import CoreImage
if let image = UIImage(named: "demo9"), let editted = applyDuotoneEffect(to: image) {
imageView.image = editted
}
func applyDuotoneEffect(to image: UIImage) -> UIImage? {
guard let ciImage = CIImage(image: image) else { return nil }
let context = CIContext(options: nil)
let grayscaleFilter = CIFilter(name: "CIPhotoEffectMono", parameters: [kCIInputImageKey: ciImage])
let solidLightColorImage = CIImage(color: CIColor(cgColor: ("efa403".toUIColor() ?? .red).cgColor)).cropped(to: ciImage.extent)
let multiplyFilter = CIFilter(name: "CIMultiplyBlendMode", parameters: [kCIInputImageKey: grayscaleFilter?.outputImage as Any, kCIInputBackgroundImageKey: solidLightColorImage as Any])
let solidDarkColorImage = CIImage(color: "290a59".toCIColor() ?? .black).cropped(to: ciImage.extent)
let lightenFilter = CIFilter(name: "CILightenBlendMode", parameters: [kCIInputImageKey: multiplyFilter?.outputImage as Any, kCIInputBackgroundImageKey: solidDarkColorImage as Any])
guard let outputImage = lightenFilter?.outputImage,
let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }
return UIImage(cgImage: cgImage)
}
extension String {
func toUIColor() -> UIColor? {
var cString = trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if (cString.hasPrefix("#")) {
cString.remove(at: cString.startIndex)
}
if ((cString.count) != 6) {
return nil
}
var rgbValue: UInt64 = 0
Scanner(string: cString).scanHexInt64(&rgbValue)
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
}
Entretanto, o fundo amarelo não parece preciso na saída:
Parece que o CILightenBlendMode
filtro muda a cor amarela também, embora eu esperasse que ele mudasse apenas os pretos para roxo. O que estou fazendo errado?
Seu efeito duotônico não está funcionando porque
CILightenBlendMode
altera mais do que apenas os pretos: ele também está afetando o amarelo.Correção: Substitua os modos de mesclagem por
CIFalseColor
filtro - é feito especificamente para efeitos duotônicos. Ele mapeia áreas escuras para roxo e áreas claras para amarelo em uma etapa.