我应该在 Swift iOS 应用程序中使用 UIImage 还是 CGImage?
Should I use UIImage or CGImage in a Swift iOS App?
我能找到的所有代码都围绕着将图像直接加载到视觉控件中。
但是,我有自己的缓存系统(从另一种语言转换项目),所以我希望尽可能高效:
- 加载 jpg/png 图像 - 可能是位图/cgimage。 (他可以来自文件系统,也可以来自网上下载的图片)
- 可能将图像另存为 compressed/resized png/jpg 文件
- 为视觉控件提供图像参考
我是 swift 和 ios 平台的新手,但据我所知,cgimage 已经很接近了吗?然而,似乎没有办法在使用 cgimage 时从他的文件系统加载图像......但我发现人们正在讨论例如UIImage,所以我现在怀疑我最初的印象是 cgimage 是否最符合我的需要。
您可以轻松地将图像加载到 UIImage 对象中...
NSData *data = [NSData dataWith...];
UIImage *image = [UIImage imageWithData:data];
如果您想在视图中显示它,可以使用 UIImageView
:
UIImageView *imageView = [[UIImageView alloc] init]; // or whatever
...
imageView.image = image;
更多内容见UIImage documentation。
很容易混淆 UIImage
、CGImage
和 CIImage
。区别如下:
UIImage: UIImage
对象是一种high-level显示图像数据的方式。您可以从文件、Quartz
个图像对象或您收到的原始图像数据创建图像。它们是不可变的,必须在初始化时指定图像的属性。这也意味着这些图像对象可以安全地从任何线程使用。
通常,您可以获取包含 PNG
或 JPEG
表示图像的 NSData
对象并将其转换为 UIImage。
CGImage: 一个CGImage
只能表示位图。 CoreGraphics 中的操作,例如混合模式和遮罩需要 CGImageRefs
。如果需要访问和更改实际的位图数据,可以使用 CGImage
。也可以转换为NSBitmapImageReps
.
CIImage: A CIImage
是表示图像的不可变对象。它不是图像。它只有与之关联的图像数据。它具有生成图像所需的所有信息。
您通常将 CIImage
对象与其他 Core Image 类 对象结合使用,例如 CIFilter
、CIContext
、CIColor
和 CIVector
。您可以使用各种来源提供的数据创建 CIImage 对象,例如 Quartz
2D 图像、Core Videos 图像等。
需要使用各种 GPU
优化的 Core Image 过滤器。它们也可以转换为 NSBitmapImageReps
。它可以基于 CPU 或 GPU.
总之,UIImage
就是您要查找的内容。原因是:
You can get image from device memory and assign it to UIImage
You can get image from URL and assign it to UIImage
You can write UIImage in your desired format to device memory
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
本来可以添加代码示例,但所有这些都是已经在 Whosebug 上得到解答的基本问题,因此没有意义。更不用说添加代码会使它变得不必要的大。
归功于总结差异:Randall Leung
根据文档位于:https://developer.apple.com/documentation/uikit/uiimage
let uiImage = uiImageView.image
let cgImage = uiImage.cgImage
我能找到的所有代码都围绕着将图像直接加载到视觉控件中。
但是,我有自己的缓存系统(从另一种语言转换项目),所以我希望尽可能高效:
- 加载 jpg/png 图像 - 可能是位图/cgimage。 (他可以来自文件系统,也可以来自网上下载的图片)
- 可能将图像另存为 compressed/resized png/jpg 文件
- 为视觉控件提供图像参考
我是 swift 和 ios 平台的新手,但据我所知,cgimage 已经很接近了吗?然而,似乎没有办法在使用 cgimage 时从他的文件系统加载图像......但我发现人们正在讨论例如UIImage,所以我现在怀疑我最初的印象是 cgimage 是否最符合我的需要。
您可以轻松地将图像加载到 UIImage 对象中...
NSData *data = [NSData dataWith...];
UIImage *image = [UIImage imageWithData:data];
如果您想在视图中显示它,可以使用 UIImageView
:
UIImageView *imageView = [[UIImageView alloc] init]; // or whatever
...
imageView.image = image;
更多内容见UIImage documentation。
很容易混淆 UIImage
、CGImage
和 CIImage
。区别如下:
UIImage: UIImage
对象是一种high-level显示图像数据的方式。您可以从文件、Quartz
个图像对象或您收到的原始图像数据创建图像。它们是不可变的,必须在初始化时指定图像的属性。这也意味着这些图像对象可以安全地从任何线程使用。
通常,您可以获取包含 PNG
或 JPEG
表示图像的 NSData
对象并将其转换为 UIImage。
CGImage: 一个CGImage
只能表示位图。 CoreGraphics 中的操作,例如混合模式和遮罩需要 CGImageRefs
。如果需要访问和更改实际的位图数据,可以使用 CGImage
。也可以转换为NSBitmapImageReps
.
CIImage: A CIImage
是表示图像的不可变对象。它不是图像。它只有与之关联的图像数据。它具有生成图像所需的所有信息。
您通常将 CIImage
对象与其他 Core Image 类 对象结合使用,例如 CIFilter
、CIContext
、CIColor
和 CIVector
。您可以使用各种来源提供的数据创建 CIImage 对象,例如 Quartz
2D 图像、Core Videos 图像等。
需要使用各种 GPU
优化的 Core Image 过滤器。它们也可以转换为 NSBitmapImageReps
。它可以基于 CPU 或 GPU.
总之,UIImage
就是您要查找的内容。原因是:
You can get image from device memory and assign it to UIImage
You can get image from URL and assign it to UIImage
You can write UIImage in your desired format to device memory
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
本来可以添加代码示例,但所有这些都是已经在 Whosebug 上得到解答的基本问题,因此没有意义。更不用说添加代码会使它变得不必要的大。
归功于总结差异:Randall Leung
根据文档位于:https://developer.apple.com/documentation/uikit/uiimage
let uiImage = uiImageView.image
let cgImage = uiImage.cgImage