swift 中 CGImage CIImage UIImage 等 有什么区别

1. UIImage - 高级图像类
用途:最常用的图像类,用于在 UIKit/AppKit 中显示图像
// 创建 UIImage
let image = UIImage(named: "example")
let imageFromData = UIImage(data: imageData)// 显示在界面上
let imageView = UIImageView(image: image)// 常用操作
image.size // 获取尺寸
image.pngData() // 转换为 PNG 数据
image.jpegData(compressionQuality: 0.8) // 转换为 JPEG 数据特点:
高级抽象,易于使用
自动处理 Retina 显示屏
支持多种图像格式
可以直接在 UI 控件中使用
2. CGImage - 核心图形图像类
用途:底层的位图表示,用于像素级操作
// 从 UIImage 获取 CGImage
guard let cgImage = image.cgImage else { return }// 直接创建 CGImage
let context = CGContext(...)
let cgImage = context.makeImage()// 像素级操作
let width = cgImage.width
let height = cgImage.height
let colorSpace = cgImage.colorSpace
let bitsPerComponent = cgImage.bitsPerComponent// 裁剪
let croppedImage = cgImage.cropping(to: CGRect(x: 0, y: 0, width: 100, height: 100))特点:
轻量级的位图表示
提供像素数据的直接访问
用于 Core Graphics 绘图操作
不支持图像滤镜
3. CIImage - 核心图像处理类
用途:用于图像处理和滤镜应用
// 创建 CIImage
let ciImage = CIImage(image: image)
let ciImageFromCG = CIImage(cgImage: cgImage)
let ciImageFromURL = CIImage(contentsOf: imageURL)// 应用滤镜
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(0.8, forKey: kCIInputIntensityKey)if let outputImage = filter?.outputImage {// 渲染结果let context = CIContext()if let resultCGImage = context.createCGImage(outputImage, from: outputImage.extent) {let resultUIImage = UIImage(cgImage: resultCGImage)}
}特点:
表示图像处理流水线,不是实际的像素数据
支持大量的内置滤镜
延迟计算,高效处理大图像
需要渲染才能显示
转换关系
// UIImage → CGImage
let cgImage = uiImage.cgImage// UIImage → CIImage
let ciImage = CIImage(image: uiImage)// CGImage → UIImage
let uiImageFromCG = UIImage(cgImage: cgImage)// CGImage → CIImage
let ciImageFromCG = CIImage(cgImage: cgImage)// CIImage → CGImage (需要渲染)
let context = CIContext()
let cgImageFromCI = context.createCGImage(ciImage, from: ciImage.extent)// CIImage → UIImage
let uiImageFromCI = UIImage(ciImage: ciImage)使用场景总结
| 类 | 使用场景 | 性能特点 |
|---|---|---|
| UIImage | UI 显示、简单图像操作 | 自动缓存、支持多种格式 |
| CGImage | 像素级操作、裁剪、绘图 | 轻量级、直接访问像素数据 |
| CIImage | 图像滤镜、复杂图像处理 | 延迟计算、高效的滤镜应用 |
实际应用示例
// 完整的图像处理流程
func applyFilterToImage(_ image: UIImage) -> UIImage? {// UIImage → CIImageguard let ciImage = CIImage(image: image) else { return nil }// 应用滤镜let filter = CIFilter(name: "CIVignette")filter?.setValue(ciImage, forKey: kCIInputImageKey)filter?.setValue(0.8, forKey: kCIInputIntensityKey)guard let outputImage = filter?.outputImage else { return nil }// CIImage → CGImage → UIImagelet context = CIContext()guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }return UIImage(cgImage: cgImage)
}