CoreImage 是 iOS 开发中常见的滤镜开发方式。
使用方式简单,参考如下:
import UIKit
extension UIImage {
/// 滤镜
var testFunc: UIImage? {
guard let cgImage = self.cgImage else {
return nil
}
let ciImage = CIImage(cgImage: cgImage)
/// CoreImage 的高斯模糊 CIGaussianBlur 会产生一个空白边缘,radius 越大空白边缘越大
/// 所以需要 clampedToExtent 和 cropped 处理
/// https://www.365seal.com/y/YNv9o28lpG.html
let outputImage = ciImage
// .clampedToExtent()
.applyingFilter("CIGaussianBlur",
parameters: [kCIInputRadiusKey:5.0])
/// 叠加多个滤镜
.applyingFilter("CIPixellate")
// .cropped(to: ciImage.extent)
let context = CIContext()
guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else {
return nil
}
let image = UIImage(cgImage: cgImage)
return image
}
}
目前有 21 个分类 1243 个滤镜,但是使用时只能传字符串(如 "CIGaussianBlur"),没有类似枚举一样的结构可以查看,使用较为麻烦。
目前包含的分类可以在 CoreImage - CIFilter 文件中找到:
/* Categories */
public let kCICategoryDistortionEffect: String
public let kCICategoryGeometryAdjustment: String
public let kCICategoryCompositeOperation: String
public let kCICategoryHalftoneEffect: String
public let kCICategoryColorAdjustment: String
public let kCICategoryColorEffect: String
public let kCICategoryTransition: String
public let kCICategoryTileEffect: String
public let kCICategoryGenerator: String
@available(iOS 5.0, *)
public let kCICategoryReduction: String
public let kCICategoryGradient: String
public let kCICategoryStylize: String
public let kCICategorySharpen: String
public let kCICategoryBlur: String
public let kCICategoryVideo: String
public let kCICategoryStillImage: String
public let kCICategoryInterlaced: String
public let kCICategoryNonSquarePixels: String
public let kCICategoryHighDynamicRange: String
public let kCICategoryBuiltIn: String
@available(iOS 9.0, *)
public let kCICategoryFilterGenerator: String
而通过 CIFilter.filterNames 可以找到分类对应的滤镜:
let filters = CIFilter.filterNames(inCategory: kCICategoryBlur)
filters.forEach { filterString in
if let filter = CIFilter(name: filterString) {
/// do something
}
}
也可以使用下面方法获取当前内置支持的滤镜:
let filters = CIFilter.filterNames(inCategory: nil)
共 233 个,猜测是不同分类或滤镜在不同设备或操作系统下支持程度不同
最后通过 CIFilter.inputKeys 找到滤镜对应的参数:
let filters = CIFilter.filterNames(inCategory: kCICategoryBlur)
filters.forEach { filterString in
if let filter = CIFilter(name: filterString) {
let keys = filter.inputKeys
/// do something
}
}
这里获取的 key 还不是最终能使用的格式,如 inputRadius,实际用的是 kCIInputRadiusKey。(首字母改成大写,加上前缀kCI,加上后缀Key)。
可以在 CoreImage - CIFilter 文件中找到对应的。
可以自己写个嵌套枚举,方便列举,但意义不大。
苹果文档有列举了些滤镜的效果:
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference
网友评论