swift 中 CGImage CIImage UIImage 等 有什么区别

41 阅读2分钟

大家好,我的开源项目PakePlus可以将网页/Vue/React项目打包为桌面/手机应用并且小于5M只需几分钟,官网地址:pakeplus.com

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 → CIImage
    guard 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 → UIImage
    let context = CIContext()
    guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil }
    
    return UIImage(cgImage: cgImage)
}

大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。 如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~