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
    }
}

 

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接