【问题标题】:iOS - View high resolution imageiOS - 查看高分辨率图像
【发布时间】:2013-04-16 06:43:57
【问题描述】:

我想在 imageview 中显示高分辨率图像。这就是我的工作

  1. 在后台准备 UIImage
  2. 文件加载完毕,切换到主线程
  3. 显示图片[使用UIImageView的setImage:]

问题是第三步有滞后。它需要几秒钟并加载文件。如果它的图像很大,我会收到内存警告和崩溃。 那么有没有一种方法可以让我从上到下绘制图像(就像浏览器那样)?我还需要保持图像的质量。

有没有办法可以满足我的要求。提前致谢

【问题讨论】:

  • 为什么不在后台线程中缩小图像?
  • 缩放会导致质量下降。我也需要支持缩放

标签: ios memory memory-management uiimageview uiimage


【解决方案1】:

如果图片很大,我会收到内存警告和崩溃。

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

那么有没有一种方法可以让我从上到下绘制图像(就像浏览器那样)?

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

Here你可以找到相关教程。

您还可以查看PhotoScrollerNetwork 项目:

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

  • 您只需提供一个 jpeg 文件或 URL,此代码即可快速、轻松地为您完成所有拼贴工作

【讨论】:

  • 谢谢 sergio.. 我正在调查它
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢 Mike.. 我正在调查它
【解决方案3】:

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

1.异步图片下载器

2.自动图片缓存。

3.避免重复。

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

关于内存警告,这不仅是由于您的应用程序,还因为所有在后台运行的应用程序有效地使用了内存,因此请尝试停止后台运行的应用程序。

【讨论】:

  • 感谢您的建议。SDWebImage 会在我失去质量的地方进行一些压缩和解压缩。要求用户关闭后台应用是不礼貌的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2013-08-25
  • 2017-08-23
  • 2017-11-26
  • 1970-01-01
  • 2011-04-07
  • 2014-08-01
相关资源
最近更新 更多