swift中的UIImage,CIImage和CGImage有啥区别[重复]

Posted

技术标签:

【中文标题】swift中的UIImage,CIImage和CGImage有啥区别[重复]【英文标题】:What is the difference between UIImage, CIImage and CGImage in swift [duplicate]swift中的UIImage,CIImage和CGImage有什么区别[重复] 【发布时间】:2019-04-25 11:34:08 【问题描述】:

我对何时使用 UIImage、CIImage 和 CGI​​mage 感到困惑

它们之间有什么区别?我什么时候可以使用它们?

【问题讨论】:

检查medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94 【参考方案1】:

UIImage

Apple 将 UIImage 对象描述为显示图像的高级方式 数据。您可以从文件、Quartz 图像对象或 从您收到的原始图像数据。它们是不可变的,必须指定 初始化时图像的属性。这也意味着 这些图像对象可以安全地从任何线程使用。通常你可以 获取包含 PNG 或 JPEG 表示图像的 NSData 对象和 将其转换为 UIImage。创建一个新的 UIImage,例如:

var newUIImage = UIImage(data: data)
//where data is a NSData

CIImage

CIImage 是表示图像的不可变对象。它不是一个 图片。它只有与之关联的图像数据。它拥有所有 生成图像所需的信息。您通常使用 CIImage 对象与其他核心图像类(如 CIFilter)结合使用, CIContext、CIColor 和 CIVector。您可以使用创建 CIImage 对象 从各种来源提供的数据,例如 Quartz 2D 图像、Core 视频图像等。需要使用各种优化的GPU 核心图像过滤器。它们也可以转换为 NSBitmapImageReps。 它可以基于 CPU 或 GPU。要创建一个新的 CIImage,

例如:

var newCIImage = CIImage(image: image)
//where image is a UIImage

CGImage

CGImage 只能表示位图。 CoreGraphics 中的操作,例如 因为混合模式和遮罩需要 CGImageRefs。如果您需要访问 并更改实际位图数据,可以使用 CGImage。它也可以 转换为 NSBitmapImageReps。从一个新的 UIImage 创建一个 CG图像,

例如:

var aNewUIImage = UIImage(CGImage: imageRef)
//where imageRef is a CGImage

【讨论】:

【参考方案2】:

它们分别属于不同的框架:UIKitCoreImageCoreGraphics

通常,您使用UIImage,除非您有其他框架派上用场的特定用例(例如使用CoreImage 过滤器)。

【讨论】:

以上是关于swift中的UIImage,CIImage和CGImage有啥区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

swift 对UIImage的CIImage

无法使用CIFilter从CIImage中提取UIImage

在裁剪之前调整 UIImage 或 CIImage 的大小会拉伸图像吗?

如何将 UIImage 转换为 CIImage,反之亦然

有啥方法可以在不将 CIImage 转换为 UIImage 或 CGImage 的情况下将 CIImage 转换为 NSData?

UIImage 在将其转换为 CIImage,然后转换为 CGImage 并返回 UIImage 时失去其方向