在没有预切瓦片的iOS上显示大图像

时间:2014-03-17 05:32:39

标签: ios image catiledlayer

我正在构建一个将图像数据保存到沙箱中的单个JPEG文件的相机应用程序。图像平均大小约为2mb。

问题:我无法在照片查看器中显示图像,因为在内存中放入一些图像会引发内存警告并使图像滚动速度非常慢。

我无法将图像分割成图块并将其保存到磁盘,因为它比显示单个图像更昂贵。我尝试在捕获时将图像分割成图块,但在5S上平均花费5 1/2秒将所有图块保存到磁盘。当应用程序在旧设备上执行时,它只会变得更糟。这非常糟糕,因为如果用户在保存中存在应用程序,该怎么办?我将丢失切片并且没有未压缩的原始文件以便稍后找到丢失的切片。

问题:什么是显示完整尺寸图像而不会导致内存问题并保持滚动速度快的最佳方法? App Store上的大量相机应用程序就是这样做的,而照片应用就是这样做的,必须有一个很好的解决方案。

注意:我目前正在显示图片的缩略图,然后在另一个帖子中从磁盘加载完整尺寸的图片。完成完整尺寸的图像加载后,我会在主线程上显示完整尺寸的图像。这消除了内存问题,因为我一次只在内存中有一个完整大小的图像,有两个缩略图,但仍然导致在滚动视图上滞后,因为在主线程中绘制完整大小的图像仍然非常昂贵。

我非常感谢任何输入!

2 个答案:

答案 0 :(得分:0)

你可以......

  1. 制作一个缩小尺寸的拇指指甲..
    • 创建一个较小的图像并将其保存在另一个"沙盒"文件夹..并读取以供浏览..然后在加载图像后,如果用户想要查看它的全尺寸。

答案 1 :(得分:0)

处理此问题的一种方法是平铺图像。 您可以将大型解压缩的图像保存到" 磁盘"作为一系列瓷砖,并且当用户平移时仅拉出您需要实际显示的瓷砖。你一次只需要内存中的1个磁贴,因为你将它绘制到屏幕上,然后将其抛出并加载下一个磁贴。 (你可能想要在内存中缓存可见的图块,但这是一个实现细节。即使将整个图像作为图块也可以减轻内存压力,因为你不需要一个大的连续块。 )

像Photoshop这样的应用程序处理这种情况。

第二种方式我建议你这样做 检查Apple中的示例,以处理名为PhotoScroller的大图像。图像已经平铺。如果您需要在Cocoa中平铺图像的示例,请查看cimgf.com

希望这会对你有所帮助。