在iOS swift中存储大图片

时间:2017-02-02 13:17:33

标签: ios caching swift3 uiimage

我打算发布一款至少有20张照片的应用程序,每张照片可以大到10mb。它们是用户可能放大很多的图片,因此需要保持分辨率非常高。我们仍然试图让它们变小,但即便如此,它们不太可能小于7mb。

图片可随应用程序一起发货,也可下载其他图片。要求图片在用户下载后可以离线使用,因为应用程序将由研究人员在偏远地区使用。

存储它们的最佳机制是什么?我应该如何将它们存储在iOS Swift 3中?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以将图片存储在应用程序的文档目录中,并将路径存储在SQLite DB中。

答案 1 :(得分:2)

没有规则,只有一套最佳实践 要存储它们,我建议您将它们直接保存到资源中,而不是Xcode图像资源,这是因为“图像资源”只能使用imageNamed: UIImage方法调用,具有副作用缓存图像。
然后,您可以创建一个包含图像名称数组的plist文件,并从此处获取您的信息。如果你需要一些更复杂的东西,那就是核心数据,但我看不到你的规范的应用。

  

内存中未压缩图像的大小是多少?   方程n_pixel_height * n_pixel_width * n_channels以字节为单位(假设8位为通道)

如果你的图像大约是10Mb,它们被压缩,这意味着它们会占用大量内存。这种设备上的内存是一种宝贵而短暂的资源。
如果你的应用程序超出了内存限制,经过一系列回调(例如didReceiveMemoryWarning)后,如果你没有足够的内存,你的应用程序将被终止。
因为模拟器使用你的mac资源,所以在这种情况下尝试设备而不是模拟器 现在如何处理大图像?
你可以使用CATiledLayer,你可以在网上找到很多教程。 CATiledLayer如名称所示,会创建图层图块,每个图块应对应图像的一部分,并且只有在可见时才会绘制它们。
不幸的是,它异步绘制,这意味着您的图块可能不会同时显示,有一些策略可以避免这个问题,苹果sample code中有一个解释。
当然有一个问题需要解决,我怎么能把我的大图像剪成瓷砖? 您可以以编程方式执行,也可以将它们作为应用程序的资源提供