2010-11-23 78 views
0

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

问题是,这些缩略图在Retina显示屏前显示效果很好,但在RD显示屏上它们看起来有些模糊。这并不坏,图像是无法使用的,但我真的希望能够得到Retina显示的全部好处,以保存用旧版本的应用程序保存的图像用户。

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

我该如何解决这个问题?考虑到上面的性能结果,做一次性迁移看起来是不可能的。其他选项会缩小缩略图(即显示在屏幕上),然后将它们保存到数据库中。第一次观看时,充满旧图像的屏幕会变得迟钝,之后会变得更加快乐。

还有其他方法可以考虑吗?任何人都面临这个问题?

回答

-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]不足以—很可能留下临时文件躺在附近,如果应用程序在写期间死亡。我建议你存储的缩略图在核心数据中,如果可以的话,但对于现有的应用程序来说这可能是不可能的。)

0
  1. 我不喜欢你试图转换图像的想法。
  2. 用户将很快变得不耐烦,并说你的应用程序是越野车,需要年龄来加载。
  3. 我觉得你解决的情况没有任何重新处理全尺寸的图像。
  4. 在较旧的硬件上,您不会有视网膜显示(因此无需升高图像)。如果他们有视网膜显示器,那么他们有一个快速的iPhone iPod。

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

而不是重新采样原始的海量图像,你可以做一个双缩略图的缩略图,使其4倍的大小。这会让它稍微模糊一些,但它看起来应该比iPhone的缩放效果好看起来很糟糕。与小图像一起工作时,上采样速度会非常快。

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

干杯,约翰。

+1

-1。图像被有效地视为GPU上的纹理,并且(据我所知)默认情况下使用双三次插值。 – 2010-11-23 03:38:09