【发布时间】:2014-03-17 05:32:39
【问题描述】:
我正在构建一个相机应用程序,它将图像数据保存到沙箱中的单个 JPEG 文件中。图像平均大小约为 2mb。
问题:我无法在照片查看器中显示图像,因为内存中有一些图像会引发内存警告并使滚动图像非常慢。
我无法将图像分割成图块并将它们保存到磁盘,因为这比显示单个图像还要昂贵。我尝试在捕获时将图像拆分为图块,但在 5S 上,平均需要 5 1/2 秒才能将所有图块保存到磁盘。随着应用程序在旧设备上执行,它只会变得更糟。这很糟糕,因为如果用户在保存过程中存在应用程序怎么办?我将有丢失的图块,并且没有未压缩的原始文件以便稍后找到丢失的图块。
问题:在不引起内存问题并保持快速滚动的情况下,显示全尺寸图像的最佳方式是什么? App Store 上的大量相机应用程序都是这样做的,而照片应用程序也是这样做的,必须有一个好的解决方案。
注意:我目前正在显示图像的缩略图,然后在另一个线程中从磁盘加载完整尺寸的图像。全尺寸图像加载完成后,我在主线程上呈现全尺寸图像。这消除了内存问题,因为我在内存中一次只有一张全尺寸图像,带有两个缩略图,但仍然导致滚动视图滞后,因为在主线程中绘制全尺寸图像仍然非常昂贵。
如果有任何意见,我将不胜感激!
【问题讨论】:
-
看看这个示例项目:github.com/jessedc/JCTiledScrollView 将大图像切割成图块并不一定要更昂贵。该项目的自述文件中也提供了许多很好的参考资料。
-
如果我错了,请纠正我,但该项目假设您有预切图块,这是我的问题,我没有预切图块,因为它是一个相机应用程序。
-
我仍然会通过将图像的平铺大小区域渲染到核心图形上下文中来平铺图像,然后在捕获图像时保存这些平铺。您的即时显示可能必须是较低的分辨率,但您可以在准备好图块时快速改进它。你在前面做了很多工作,但在连续观看时却少了很多。
-
我尝试将图像分割成图块并在捕获时将它们写入磁盘,但在 iPhone 5S 上保存所有图块平均需要 5 1/2 秒。这真的很糟糕,因为 5S 几乎是最快的设备,所以这意味着它只会从那里变慢。这里的问题是,如果用户在保存过程中关闭了应用程序怎么办?我会有丢失的图块,并且没有原始文件可以稍后找到那些丢失的图块。
-
当然这是很多工作,但我仍然会平铺它们。首先像现在一样保存并呈现原始图像。在后台处理您的图块并尽可能切换。你只需要忍受延迟滚动,直到你的 bg 处理完成。
标签: ios image catiledlayer