我应该在Swift iOS应用程序中使用UIImage或CGImage吗?

时间:2015-12-29 14:30:45

标签: ios cgimage

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

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

  • 加载jpg / png图像 - 可能是一个位图/ cgimage。 (他可以来自文件系统,也可以来自在线下载的图像)
  • 可能将图像保存为压缩/调整大小的png / jpg文件
  • 为视觉控制提供图像参考

我是swift和ios平台的新手,但据我所知,cgimage尽可能接近?但是,在使用cgimage时,似乎没有办法从文件系统加载图像......但是我发现人们正在讨论例如UIImage,所以我现在怀疑我的初步印象ha cgimage是最符合我需求的。

3 个答案:

答案 0 :(得分:27)

很容易在UIImageCGImageCIImage之间感到困惑。区别在于:

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

CGImage: A CGImage只能代表位图。 CoreGraphics中的操作(例如混合模式和屏蔽)需要CGImageRefs。如果您需要访问和更改实际的位图数据,可以使用CGImage。它也可以转换为NSBitmapImageReps

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

总之,UIImage正是您所寻找的。原因是:

  1. You can get image from device memory and assign it to UIImage

  2. You can get image from URL and assign it to UIImage

  3. You can write UIImage in your desired format to device memory

  4. You can resize image assigned to UIImage

  5. Once you have assigned an image to UIImage, you can use that instance in controls directly. e.g. setting background of a button, setting as image for UIImageView

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

    总结差异的信用:Randall Leung

答案 1 :(得分:0)

您可以轻松地将图像加载到UIImage对象中......

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

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

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

UIImage documentation中查看更多内容。

答案 2 :(得分:0)

根据https://developer.apple.com/documentation/uikit/uiimage

的文档
let uiImage = uiImageView.image
let cgImage = uiImage.cgImage