Apple 在 CoreImage 里提供了强大的 CIFilter 方便我们影像处理
前提是只能处理 CIImage,所以需要先将 Image 转成 CIImage
convenience init?(named: String) { guard let image = UIImage(named: named)?.cgImage else { return nil } self.init(cgImage: image)}
回到 CIFilter,
原本使用的方法: CIFilter(name: "CIBoxBlur"),太不Swifty了。
还好官方提供了另一种方法:只要 import CoreImage.CIFilterBuiltins 就能使用 CIFilter.boxBlur()
进入主题
人物去背,只要使用 CIFilter.personSegmentation() 就可以达到效果
以Jay为例
let input = CIImage(named: "Jay")!let person = CIFilter.personSegmentation()person.inputImage = inputperson.qualityLevel = 1
就会得到遮照图
这时候只要让原图混上红色遮照图就完成了
let mask = CIFilter.blendWithRedMask()mask.inputImage = inputmask.maskImage = person.outputImage
等等,发生什么事?
仔细看就会发现,person 和 input 的长宽比不一样
所以需要做调整
extension CIImage { func scale(size: CGSize) -> CIImage { let x = size.width / self.extent.width let y = size.height / self.extent.height let transform = CGAffineTransform(scaleX: x, y: y) return transformed(by: transform) }}
mask.maskImage = person.outputImage!.scale(size: size)