0

我有一个 iPhone 应用程序,除其他外,它允许用户存储照片。将新照片添加到应用程序的数据存储时,我会缓存该图像的缩略图版本,以便在合理的时间内加载照片缩略图网格。

问题是这些缩略图在预视网膜显示屏上看起来很棒,但在 RD 显示屏上看起来有点模糊。图像无法使用并不是那么糟糕,但我真的希望能够为用户使用我的应用程序的旧版本保存的图像获得 Retina Display 的全部好处。

问题是重新创建所有这些缩略图需要太长时间。在我的测试中,在我的 iPhone 4 上将示例数据库重新编码为高分辨率缩略图(当然是大缩略图)大约需要一分半钟。在旧硬件上情况会更糟。

我怎样才能解决这个问题?鉴于上述性能结果,进行一次性迁移似乎是不可能的。其他选项是懒惰地缩小缩略图(即,当它们显示在屏幕上时),然后将它们保存到数据库中。满是旧图像的屏幕在第一次被查看时会很迟钝,之后会变得更快。

还有其他方法可以考虑吗?还有其他人遇到过这个问题吗?

4

2 回答 2

0
  1. 我不喜欢您尝试转换图像的想法。
  2. 用户很快就会变得不耐烦,并说您的应用程序有问题并且需要很长时间才能加载。
  3. 我认为您无需对全尺寸图像进行任何重新处理即可解决问题。
  4. 在较旧的硬件上,您将没有视网膜显示器(因此无需放大图像)。如果他们有一个视网膜显示器,那么他们就有一个快速的 iPhone iPod。

我建议您通过显示缩略图的方式以图形方式解决问题。所以不是全屏,而是在这个图像周围加上一个边框,并以它的真实分辨率显示它(不要放大它)。或者在通常显示 1 的地方显示 4 张图像(因为 iPhone 屏幕是分辨率的 4 倍)。

您可以对缩略图进行双三次上采样,而不是对原始海量图像进行重新采样,使其大小成为 4 倍。这会使它略微模糊,但它应该看起来比 iPhone 缩放效果更好,这看起来真的很糟糕。上采样将是超快的,因为它使用小图像。

我无法帮助您进行上采样,但某处会有一些代码。

干杯,约翰。

于 2010-11-23T02:46:38.313 回答
-1

满是旧图像的屏幕在第一次被查看时会很迟钝,之后会变得更快。

它不必迟钝。

有点痛苦,但您可以在后台线程中完成大部分处理。将线程优先级设置为较低的值(如 0.1)以避免使 UI 太慢。最简单的方法是为您需要转换的每个图像设置一个 NSOperation,并将它们添加到 maxConcurrentOperationCount=1 的 NSOperationQueue。

如果写入不是原子的,则在 -applicationDidEnterBackground: 或 -applicationWillTerminate: 中(或在侦听相应通知通知的内容中),执行类似的操作[queue cancelAllOperations]; for (NSOperation * operation in queue) { [operation setThreadPriority:1]; } [queue waitUntilAllOperationsAreFinished];;你得到大约 10 秒左右的时间,这应该足以让图像转换完成写入磁盘(从而避免半写文件)。为了增加保护,请[operation isCancelled]在写入前立即检查是否可能需要超过 10 秒。显然,在 -applicationWillEnterForeground: 中,你应该重新开始转换(记住有些图像已经被转换了)。

跟踪并发问题很有趣......

(请注意,这[data writeToFile:path atomically:YES]还不够——如果应用程序在写入期间被终止,它可能会留下临时文件。如果可以的话,我建议将缩略图存储在 Core Data 中,但这对于现有应用程序来说可能是不可能的。 )

于 2010-11-23T03:55:58.047 回答