iOS - 查看高分辨率图像

时间:2013-04-23 06:52:10

标签: ios memory memory-management uiimageview uiimage

我想在imageview中显示高分辨率图像。这是我做的事情

  1. 在后台准备UIImage
  2. 加载文件后,切换到主线程
  3. 显示图像[使用UIImageView的setImage:]
  4. 问题是第3步有滞后。它需要几秒钟并加载文件。如果它是一个大图像,我得到内存警告和崩溃。 那么我可以通过哪种方式从上到下绘制图像(就像浏览器一样)?另外,我需要保持图像的质量。

    有没有办法可以达到我的要求。提前致谢

3 个答案:

答案 0 :(得分:1)

UIImage在实际请求之前不会解码其底层图像数据,当您将其分配给图像视图时,它将在主线程上发生。因此,尽管您尝试在后台线程中加载图像,但工作正在延迟并且实际发生在主线程上。

此问题的解决方法非常糟糕,通常涉及将图像写入新的图形上下文以强制解码,然后从中创建CGImageRefUIImage。这一切都发生在后台线程上。当您将新图像发送到主线程时,所有解码都已经发生,您不应该看到延迟。 This question has some answers which demonstrate this technique.

使用Apple提供的标准API(据我所知),无法从上到下绘制图像。您必须编写自己的流式图像解码器,这将是一项重要任务。

答案 1 :(得分:1)

您可以使用 SDWebImage 框架来帮助您:

1.异步图像下载器

2.自动图像缓存。

3.避免重复。

您可以从以下网址下载:https://github.com/rs/SDWebImage

关于内存警告,不仅仅是因为你的应用程序是由于在后台运行的所有应用程序的有效内存使用,所以尝试停止后台运行的应用程序。

答案 2 :(得分:1)

  

如果是一张大图像,我会收到内存警告并发生崩溃。

您的设备似乎遇到了一些“硬”(内存相关)限制,试图立即加载并将图像显示到内存中。

  

那么有没有办法从上到下绘制图像(比如浏览器的工作方式)?

您应该尝试使用CATiledLayer,它提供了一种绘制非常大的图像而不会导致内存命中的方法。

Here你可以找到关于它的教程。

您还可以查看PhotoScrollerNetwork项目:

  
      
  • 超快速的平铺渲染 - 在视觉上比Apple的代码(在文件系统中使用png文件)快得多

  •   
  • 您提供了一个jpeg文件或网址,此代码可以快速,轻松地为您完成所有平铺

  •