CoreImage 分类、滤镜和滤镜参数的获取

2024-01-11  本文已影响0人  zackzheng

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

上一篇 下一篇

猜你喜欢

热点阅读