1

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

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

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

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

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

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

4

2 回答 2

4

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

您的问题是由 SDWebImage 中的错误引起的。见。如果它不存在,请继续并提交错误。

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

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

image = [UIImage imageWithCGImage: image.CGImage scale: [UIScreen mainScreen].scale]
于 2013-04-25T12:26:07.097 回答
0

发现 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 )上提交了拉取请求

于 2013-04-25T16:46:21.933 回答