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

Posted

技术标签:

【中文标题】iOS SDWebImage - 如何正确处理不同设备上的视网膜图像?【英文标题】:iOS SDWebImage - How to properly handle retina images on different devices? 【发布时间】:2013-04-24 18:26:06 【问题描述】:

我在我的应用程序中使用 SDWebImage 库进行图像缓存,但无法正确显示视网膜图像。

我知道在 github 页面上有很多关于下载视网膜图像的讨论,但无法确定是否已完全解决,也没有任何“官方”操作方法。

因为我的应用是通用的,所以我下载的每张图片都会有 4 种变体。这是一个例子:

iPhone:http://www.DOMAIN.com/my-image~iphone.png iPhone 视网膜:http://www.DOMAIN.com/my-image@2x~iphone.png iPad:http://www.DOMAIN.com/my-image~ipad.png iPad 视网膜:http://www.DOMAIN.com/my-image@2x~ipad.png

下载这些图像并让设备使用正确的 SDWebImage 方法是什么?

我尝试在我的 iPhone 5 上下载 @2x-iphone.png 图像,但它显示的图像被放大和像素化,就好像它不知道这是一个 @2x 图像。

使用多种设备类型处理视网膜图像的正确方法是什么?

【问题讨论】:

【参考方案1】:

首先,原因 - UIImage 不知道图像是视网膜图像还是常规图像。当您调用-[UIImage imageNamed:] 时,它会调用-[UIImage imageWithData:scale:],并带有适当的比例值。

您的问题是由 SDWebImage 中的错误引起的。见source。如果它不存在,请继续file a bug。

问题是 SDWebImage 只查找 @2x.png/jpeg 文件名来确定它是否是视网膜图像。您可以继续修复该功能以检查@2x~iphone.png/@2x~ipad.png 文件名。

或者,如果您不想接触 SDWebImage 代码,请在您的 webImageManager:didFinishWithImage:forURL:userInfo: 回调中检查文件名是否为视网膜图像,如果是,请执行以下操作:

image = [UIImage imageWithCGImage: image.CGImage scale: [UIScreen mainScreen].scale]

【讨论】:

谢谢!这让我指出了正确的方向!这是用于检测视网膜的过滤器字符串的问题。请参阅我的以下答案。 @Mar0ux 做得好,谢谢!但是请编辑您的答案,因为有一个小错误。 imageWithData 不接受 image.CGImage (它应该是 NSData 类型)所以它可能应该是 [UIImage imageWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]。 @KlimczakM 完成。谢谢!【参考方案2】:

发现 SDWebImage 仅使用以下过滤器来确定图像是否为视网膜(位于 SDWebImageCompat.m 中):

NSRange range = [path rangeOfString:@"@2x." options:0 range:NSMakeRange(path.length - 8, 5)];

因为它只搜索“@2x”。 (注意句号)并且只有当它落在字符串的末尾时,名称如“my-image@2x~iphone.png”的图像才会被检测为视网膜。

更新了代码以在整个图像 URL 中搜索“@2x”。唯一关心的是你不能在 url 中的任何其他地方使用“@2x”(但是哪个开发人员曾经使用过这种命名约定?):

NSRange range = [path rangeOfString:@"@2x" options:0 range:NSMakeRange(0,path.length)];

我还在 SDWebImage GitHub 页面 (https://github.com/rs/SDWebImage/pull/370) 上提交了拉取请求

【讨论】:

以上是关于iOS SDWebImage - 如何正确处理不同设备上的视网膜图像?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中SDWebImage加载图片不显示(图片地址在浏览器中能显示)

SDWebImage的使用与原理

iOS SDWebImage

SDWebImage源码分析

iOS网络开发网络图片加载开源框架SDWebImage

[iOS开发]SDWebImage源码学习