我应该在Swift iOS应用中使用UIImage还是CGImage?

我能find的所有代码都是围绕直接将图像加载到可视化控件中。

然而,我有我自己的caching系统(从另一种语言转换项目),所以我尽可能高效的想要以下内容:

  • 加载jpg / png图像 – 可能放入一个bitmap / cgimage。 (他可以从文件系统或从网上下载的图像)
  • 可能将图像保存为压缩/resize的png / jpg文件
  • 为视觉控制提供图像参考

我对swift和ios平台很陌生,但据我所知,cgimage是如此之近? 然而,似乎没有办法从他的文件系统加载图像时使用cgimage …但我已经find人们讨论如UIImage的方式,所以我现在怀疑我的最初印象哈cgimage是最好的匹配我的需求。

UIImageCGImageCIImage之间很容易混淆。 区别如下:

UIImage: UIImage对象是显示图像数据的高级方法。 您可以从文件, Quartz图像对象或从您接收的原始图像数据创build图像。 它们是不可变的,必须在初始化时指定图像的属性。 这也意味着这些图像对象可以安全地从任何线程使用。 通常情况下,您可以将包含PNGJPEG表示图像的NSData对象转换为UIImage。

CGImage: CGImage只能表示位图。 CoreGraphics中的操作,如混合模式和遮罩需要CGImageRefs 如果您需要访问和更改实际的位图数据,则可以使用CGImage 它也可以转换为NSBitmapImageReps

CIImage: CIImage是表示图像的不可变对象。 这不是一个图像。 它只有与之相关的图像数据。 它具有生成图像所需的所有信息。 通常将CIImage对象与其他Core Image类(如CIFilterCIContextCIColorCIVector 您可以使用各种来源(如Quartz 2D图像,Core Videos图像等)提供的数据创buildCIImage对象。需要使用各种GPU优化的Core Image滤镜。 他们也可以转换成NSBitmapImageReps 它可以基于CPU或GPU。

总之, UIImage是你在找什么。 原因是:

  1. 您可以从设备内存中获取图像并将其分配给UIImage

  2. 您可以从URL获取图像并将其分配给UIImage

  3. 您可以将UIImage以您需要的格式写入设备内存

  4. 您可以调整分配给UIImage的图像大小

  5. 一旦你分配了一个图像到UIImage,你可以直接在控件中使用该实例。 例如设置一个button的背景,设置为UIImageView的图像

会添加代码示例,但这些都是已经在Stackoverflow上已经回答的基本问题,所以没有意义。 更不用说添加代码会使这个不必要的大。

信贷总结差异: 兰德尔梁

你可以很容易地加载你的图像到一个UIImage对象…

 NSData *data = [NSData dataWith...]; UIImage *image = [UIImage imageWithData:data]; 

如果你想在视图中显示它,你可以使用UIImageView

 UIImageView *imageView = [[UIImageView alloc] init]; // or whatever ... imageView.image = image; 

有关详细信息,请参阅UIImage文档 。

请按照以下文档: https : //developer.apple.com/documentation/uikit/uiimage

 let uiImage = uiImageView.image let cgImage = uiImage.cgImage