使用 SDWebImage 处理超大图像的下载

Posted

技术标签:

【中文标题】使用 SDWebImage 处理超大图像的下载【英文标题】:Handling download of very large images with SDWebImage 【发布时间】:2014-06-12 05:42:58 【问题描述】:

我使用SDWebImage 将图像异步下载到我的UIImageViews。收到的大多数图片大小都可以接受,可以轻松下载并设置为UIImageViews。

但有时,URL 上的源图像的分辨率非常高(相对于我的imageView - 60x60 的大小)。在这种情况下,永远不会设置图像。有时我的应用程序崩溃,有时什么也没有发生(图像保持nil),在极少数情况下,我收到类似以下的错误:Unable to allocate 400000 bytes of memory(我不完全确定确切的错误日志,我很抱歉)。

例如,来自 Pinterest 网站本身的 pinterest 图标this 图像是巨大的 (10000 x 10000)。我的imageView 永远无法绘制此图像。目前,我已经硬编码以用this 替换图像,但我知道这是不好的做法。此外,这只是一种情况,可能会有无限多这样的图像可能会影响用户体验。

我该如何处理这种情况?

【问题讨论】:

图片下载是否正确?我的意思是,无论图片多大,您都可以下载吗? 我创建了一个拉取请求来解决这个问题github.com/rs/SDWebImage/pull/769 【参考方案1】:

只需检查您收到的图像尺寸,当尺寸远大于您的 imageview 可接受的尺寸时,您可以调整图像大小,此处链接用于调整图像大小link。调整大小后,您可以将其放置在 imageview 中。希望对你有所帮助。

【讨论】:

【参考方案2】:

我建议你使用这个AsyncImageView。我用过它,效果很好。要调用此 API:

ASyncImage *img_EventImag = alloc with frame;
NSURL *url = yourPhotoPath;
[img_EventImage loadImageFromURL:photoPath];
[self.view addSubView:img_EventImage];

与使用 UIImageView 相同。很简单,它可以为您完成大部分工作。 AsyncImageView 包括 UIImageView 上的一个简单类别,用于在 ios 上异步加载和显示图像,以便它们不会锁定 UI,以及用于更高级功能的 UIImageView 子类。 AsyncImageView 与 URL 一起使用,因此它可以与本地或远程文件一起使用。

加载/下载的图像缓存在内存中,并在出现内存警告时自动清理。 AsyncImageView 独立于 UIImage 缓存运行,但默认情况下,位于应用程序包根目录中的任何图像都将存储在 UIImage 缓存中,以避免缓存图像的任何重复。

该库还可用于独立于 UIImageView 加载和缓存图像,因为它提供对底层加载和缓存类的直接访问。

【讨论】:

AsyncImageView 在 tableView 中使用时有一个缺点是显示重复的图像。 :(【参考方案3】:

SDWebImage 是开源库。将源添加到您的项目并在 SDWebImageDownloader.m 中附加您的尺寸检查

【讨论】:

以上是关于使用 SDWebImage 处理超大图像的下载的主要内容,如果未能解决你的问题,请参考以下文章

带有 PHAsset 的 SDWebImage

SDWebImage 的简单使用方法

如何获取缓存图像 SDWebImage 的数据

SDWebImage 使用 Swift 在 CellView 中将图像设置为 UIButton

SDWebImage源码阅读(十五)UIView+WebCacheOperation

iOS SDWebImage - 如何正确处理不同设备上的视网膜图像?