我有以下源图像:
我正在尝试将其转换为:
我已经建立了这个代码:
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)
)
}
}
但是,黄色背景在输出中看起来并不准确:
CILightenBlendMode
我以为滤镜只会将黑色变成紫色,但实际上滤镜似乎也改变了黄色。我做错了什么?
双色调效果不起作用,因为
CILightenBlendMode
改变的不仅仅是黑色 - 它也影响了黄色。修复:用滤镜替换混合模式
CIFalseColor
- 它专为双色调效果而设计。它只需一步即可将暗区映射为紫色,将亮区映射为黄色。