CIContext 是 Core Image 框架中的一个核心类,负责渲染 CIImage 对象并将结果输出为各种格式,例如位图、CGImage、PDF 文件等。它是 Core Image 渲染引擎的接口,用于处理图像计算的底层操作。
CIContext 的主要功能
1、图像渲染:
将 CIImage 渲染为 CGImage 或 UIImage。
可以直接将渲染结果绘制到设备上下文(如屏幕、PDF)。
2、性能优化:
支持 GPU、CPU 或 Metal 渲染。
可以重复使用以提高性能。
3、处理图像缓存:
管理和复用缓存以提升效率。
创建 CIContext
CIContext 提供了多种初始化方式,可以选择基于不同的硬件加速器(CPU 或 GPU)。以下是常见的初始化方法:
1、使用默认配置创建上下文
let context = CIContext()
2、基于 GPU 创建上下文
通过指定选项,可以让 CIContext 优化 GPU 渲染。
let options: [CIContextOption: Any] = [
.useSoftwareRenderer: false // 使用 GPU(如果为 true,则使用 CPU)
]
let gpuContext = CIContext(options: options)
3、使用 Metal 创建上下文
如果应用中使用 Metal,可以通过 MTLDevice 创建 CIContext。
import Metal
if let metalDevice = MTLCreateSystemDefaultDevice() {
let metalContext = CIContext(mtlDevice: metalDevice)
}
4、使用 Core Graphics 创建上下文
如果需要与 CGContext 一起使用,可以用 CGContext 初始化 CIContext。
if let cgContext = UIGraphicsGetCurrentContext() {
let ciContext = CIContext(cgContext: cgContext, options: nil)
}
常见用法
1、渲染 CIImage 为 CGImage
let context = CIContext()
if let ciImage = CIFilter(name: "CISepiaTone")?.outputImage {
let rect = CGRect(x: 0, y: 0, width: 300, height: 300)
if let cgImage = context.createCGImage(ciImage, from: rect) {
let uiImage = UIImage(cgImage: cgImage)
}
}
2、将图像渲染到 UIImage
let context = CIContext()
if let ciImage = CIFilter(name: "CIGaussianBlur")?.outputImage,
let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
let uiImage = UIImage(cgImage: cgImage)
print("Rendered UIImage: \(uiImage)")
}
3、将结果直接绘制到屏幕或 PDF
let context = CIContext()
if let ciImage = CIFilter(name: "CITwirlDistortion")?.outputImage,
let cgContext = UIGraphicsGetCurrentContext() {
context.draw(ciImage, in: CGRect(x: 0, y: 0, width: 300, height: 300), from: ciImage.extent)
}
CIContext 的选项
在创建 CIContext 时,可以通过字典传入配置选项,例如:
- .useSoftwareRenderer:指定是否使用软件渲染(true:CPU,false:GPU)。
- .priorityRequestLow:指定渲染请求的优先级(true:低优先级,适合后台任务)。
- .outputColorSpace:指定输出的颜色空间。
- .workingColorSpace:指定处理过程中使用的颜色空间。
性能注意事项
1、重复使用 CIContext:
创建 CIContext 是昂贵的操作。为了优化性能,建议在应用的生命周期中重复使用同一个 CIContext。
2、选择合适的渲染模式:
在性能敏感的场景下,尽量使用 GPU 渲染。
对低功耗设备,可以选择 CPU 渲染以节省电量。
3、避免频繁切换上下文:
在图像处理链中频繁切换不同的 CIContext 会导致性能下降。
通过 CIContext 的灵活性和强大功能,可以高效地完成图像处理任务,同时利用硬件加速能力提升性能。