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 的延迟计算特性使其在性能优化和实时图像处理场景中表现优异。