Core Image的Filter滤镜
所属分类:ios | 发布于 2024-12-22
【号外号外】 新站正在申请Adsense,动动您发财的小手,点击访问帮网站增加一个IP: https://alantools.com
1、创建滤镜的三种方式
1.1、方法一
// need import CoreImage.CIFilterBuiltins
func comicEffect(inputImage: CIImage) -> CIFilter {
let filter = CIFilter.comicEffect()
filter.inputImage = inputImage
return filter
}
1.2、方法二
func comicEffectSecondWay(inputImage: CIImage) -> CIFilter {
guard let filter = CIFilter(name: "CIComicEffect") else {
fatalError("Unable to create CIComicEffect Filter")
}
filter.setValue(inputImage, forKey: kCIInputImageKey)
return filter
}
1.3、方法三
func comicEffectThirdWay(inputImage: CIImage) -> CIFilter {
let parameters = [
kCIInputImageKey: inputImage
]
guard let filter = CIFilter(name: "CIComicEffect", parameters: parameters) else {
fatalError("Unable to create CIComicEffect Filter")
}
return filter
}
2、滤镜调用流程
func applyFilter() {
// 1. get CIImage
guard let image,
let ciImage = image.coreImage else { fatalError("Unable to create CIImage") }
// 2. set effect
// 在这里改变滤镜,1,3,4算是固定格式
let comicEffect = CIFilterService.shared.comicEffect(inputImage: ciImage)
guard let outputImage = comicEffect.outputImage else { fatalError("Unable to get output image form filter") }
// 3. create CGImage
let context = CIContext()
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { fatalError("Unable to create CGImage from CIImage")
}
// 4. set image from CGImage for view
self.filteredImage = cgImage.cpImage
}
3、iOS和macOS通用图片处理
在iOS平台使用的是UIImage, 在macOS平台使用的是NSImage,解决方法是使用一个别名,然后根据规则判断。
import SwiftUI
#if canImport(UIKit)
public typealias CPImage = UIImage
#elseif canImport(AppKit)
public typealias CPImage = NSImage
#endif
extension CPImage {
var coreImage: CIImage? {
#if canImport(UIKit)
guard let cgImage = self.cgImage else { return nil }
return CIImage(cgImage: cgImage)
#elseif canImport(AppKit)
guard let tiffData = tiffRepresentation,
let ciImage = CIImage(data: tiffData) else { return nil }
return ciImage
#endif
}
}
extension CGImage {
var cpImage: CPImage {
#if canImport(UIKit)
return UIImage(cgImage: self)
#elseif canImport(AppKit)
return NSImage(cgImage: self, size: .init(width: width, height: height))
#endif
}
}
extension Image {
init(cpImage: CPImage) {
#if canImport(UIKit)
self.init(uiImage: cpImage)
#elseif canImport(AppKit)
self.init(nsImage: cpImage)
#endif
}
}