更新Retina Display的已保存图像

时间:2010-11-23 01:36:28

标签: iphone uiimage resolution retina-display

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

  1. 我不喜欢你尝试转换图像的想法。
  2. 用户会很快感到不耐烦,并说你的应用程序有问题,需要很长时间才能加载。
  3. 我认为你可以在不重新处理全尺寸图像的情况下解决问题。
  4. 在较旧的硬件上,您将没有视网膜显示器(因此无需升级图像)。如果他们有视网膜显示器,那么他们就拥有一部快速的iPhone iPod。
  5. 我建议您通过显示缩略图图像的方式以图形方式解决问题。因此,不是全屏,而是在此图像周围放置边框并以其真实分辨率显示(不要高档)。或者显示通常显示1的4个图像(因为iPhone屏幕的分辨率是4倍)。

    不是重新采样原始的海量图像,而是可以对缩略图进行双三次上采样,使其大小为4倍。这将使它稍微模糊,但它看起来应该比iPhone缩放看起来更好看起来非常糟糕。上传采样速度非常快,因为它可以处理小图像。

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

    干杯,约翰。

答案 1 :(得分:-1)

  

在第一次看到它们时,装满旧图像的屏幕会很迟钝,之后会变得更加快速。

它不一定是迟钝的。

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

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

并发问题很容易追踪......

(注意[data writeToFile:path atomically:YES]是不够的 - 如果应用程序在写入期间被杀死,可能会留下临时文件。如果可以的话,我建议将缩略图存储在Core Data中,但这可能是现有应用程序无从谈起。)