图像处理类CIImage
图像处理类CIImage

图像处理类CIImage

CIImage 是 Apple 的 Core Image 框架中的一个类,用于表示图像数据。与 CGImage 类似,CIImage 也用于处理图像,但其设计目的是支持非破坏性、链式图像处理操作,是 Core Image 框架实现图像特效和滤镜的基础。

CIImage 的特点

1、懒加载与高效处理

CIImage 并不直接存储图像的像素数据,而是一个抽象的图像表示。

它会存储图像的源数据以及处理操作的描述,在需要渲染时才进行实际的计算和操作。

意味着只有图像显示在屏幕上或转换为 CGImage,Core Image 才会执行这些操作。

2、用于图像处理链

CIImage 可与 CIFilter 和 CIContext 配合,创建复杂的图像处理链。

多个滤镜可以级联操作,且只在最终渲染时才计算结果,避免了中间数据的浪费。

3、多种图像来源

CIImage 可以从文件、数据、CGImage、UIImage、视频帧等多种来源创建。

4、非破坏性操作

Core Image 的所有操作都是非破坏性的,意味着原始图像不会被修改

创建 CIImage 的方式

CIImage 可以从多种数据源创建,以下是一些常见方式:

1、从文件创建

if let url = Bundle.main.url(forResource: "example", withExtension: "jpg") {
    let ciImage = CIImage(contentsOf: url)
    print("Created CIImage: \(String(describing: ciImage))")
}

2、从 UIImage 创建

if let uiImage = UIImage(named: "example") {
    let ciImage = CIImage(image: uiImage)
    print("Created CIImage: \(String(describing: ciImage))")
}

3、从 CGImage创建

if let cgImage = UIImage(named: "example")?.cgImage {
    let ciImage = CIImage(cgImage: cgImage)
    print("Created CIImage: \(String(describing: ciImage))")
}

4、从像素数据流创建

用于实时视频处理时,从视频帧或像素缓冲区创建:

let buffer: CVPixelBuffer = /* 获取像素缓冲区 */
let ciImage = CIImage(cvPixelBuffer: buffer)

使用 CIImage 进行滤镜操作

CIImage 的强大之处在于与 CIFilter 的结合。以下是一个简单示例,应用模糊滤镜:

import CoreImage
import CoreImage.CIFilterBuiltins
import SwiftUI

struct ContentView: View {
    var body: some View {
        if let image = applyBlurEffect(to: UIImage(named: "example")) {
            Image(uiImage: image)
                .resizable()
                .scaledToFit()
        }
    }

    func applyBlurEffect(to inputImage: UIImage?) -> UIImage? {
        guard let inputImage = inputImage else { return nil }
        let ciImage = CIImage(image: inputImage)
        
        // 创建模糊滤镜
        let filter = CIFilter.gaussianBlur()
        filter.inputImage = ciImage
        filter.radius = 10.0

        // 渲染滤镜效果
        let context = CIContext()
        if let outputImage = filter.outputImage,
           let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
            return UIImage(cgImage: cgImage)
        }
        return nil
    }
}

与 CGImage 和 UIImage 的互操作

CIImage 可以轻松转换为 CGImage 和 UIImage,以便显示或进一步处理。

CIImage → CGImage

let context = CIContext()
if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
    // 使用 CGImage
}

CIImage → UIImage

let uiImage = UIImage(ciImage: ciImage)

总结

CIImage 是一个强大的图像处理类,设计用于高效的图像特效和滤镜操作。

它与 CIFilter 和 CIContext 协作,支持非破坏性、多阶段的图像处理。

相较于 CGImage 和 UIImage,CIImage 的延迟计算特性使其在性能优化和实时图像处理场景中表现优异。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注