代码之家  ›  专栏  ›  技术社区  ›  Bill

更新保存的视网膜显示图像

  •  0
  • Bill  · 技术社区  · 15 年前

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

    问题是,这些缩略图在视网膜前的显示屏上看起来很棒,但在RD显示屏上看起来有点模糊。图像不可用并不是很糟糕,但我真的希望能够充分利用Retina Display为使用我的应用程序的旧版本保存的图像用户提供的好处。

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

    我怎么能避开这个?考虑到上面的性能结果,执行一次性迁移似乎是不可能的。其他选项是缓慢收缩缩略图(即在屏幕上显示缩略图),然后将其保存到数据库中。满是旧图像的屏幕在第一次被观看时会变得迟钝,之后会变得很快。

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

    2 回复  |  直到 15 年前
        1
  •  -1
  •   tc.    15 年前

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

    它不必迟钝。

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

    如果写操作不是原子的,则in-applicationidenterbackground:or-applicationWillTerminate:(或在侦听相应通知通知的某个地方),执行如下操作 [queue cancelAllOperations]; for (NSOperation * operation in queue) { [operation setThreadPriority:1]; } [queue waitUntilAllOperationsAreFinished]; ;大约10秒,这应该足以让图像转换完成对磁盘的写入(从而避免半写文件)。为了增加保护,检查 [operation isCancelled] 在写之前,如果可能需要10秒以上的时间。显然,在-applicationwillenterproefronous:,您应该重新启动转换(记住有些图像已经被转换)。

    并发问题是有趣的跟踪。。。

    (注意 [data writeToFile:path atomically:YES] 还不够-如果应用程序在写入过程中被终止,可能会留下临时文件。如果你可以,我建议将缩略图存储在核心数据中,但对于现有的应用程序来说这是不可能的。

        2
  •  0
  •   John Ballinger    15 年前
    1. 我不喜欢你试图转换图像的想法。
    2. 用户会很快变得不耐烦,说你的应用程序有缺陷,需要很长时间才能加载。
    3. 我想你不用重新处理全尺寸图像就可以解决这个问题。
    4. 在旧的硬件上,你不会有视网膜显示(所以不需要放大图像)。如果他们有视网膜显示器,那么他们有一个快速iPhone iPod。

    我建议你用图形化的方式来解决这个问题,比如你如何显示缩略图。所以与其全屏显示,不如在图片周围加一个边框,以真实的分辨率显示出来(不要放大)。或者在通常显示1的地方显示4个图像(因为iPhone屏幕的分辨率是4倍)。

    你可以对缩略图进行双三次上采样,使其大小增加4倍,而不是对原始的海量图像进行重新采样。这将使它稍微模糊,但它应该比iPhone的缩放效果好,这看起来很糟糕。上例将是超快速的工作与一个小图像。

    我不能帮你进行放大,但某处会有一些代码。

    干杯,约翰。