iOS SDWebImage — как правильно обрабатывать изображения сетчатки на разных устройствах?

Я использую библиотеку SDWebImage для кэширования изображений в своих приложениях, но не смог правильно отображать изображения сетчатки.

Я знаю, что на странице github было много разговоров о загрузке изображений сетчатки, но я не могу точно сказать, была ли она полностью решена, и нет ли каких-либо «официальных» инструкций.

Поскольку мое приложение является универсальным, для каждого изображения, которое я загружаю, будет 4 варианта. Вот пример:

Каков правильный способ загрузки этих изображений, чтобы устройство использовало правильный образ с SDWebImage?

Я пытался загрузить изображение @2x-iphone.png на свой iPhone 5, но он отображал изображение увеличенным и пикселизированным, как будто он не знал, что это изображение @2x.

Каков правильный метод обработки изображений сетчатки с несколькими типами устройств?


person JimmyJammed    schedule 24.04.2013    source источник


Ответы (2)


Во-первых, причина - 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]
person maroux    schedule 25.04.2013
comment
Спасибо! Это заставило меня указать в правильном направлении! Проблема заключалась в том, что строка фильтра использовалась для обнаружения сетчатки. Смотрите мой ответ ниже. - person JimmyJammed; 25.04.2013
comment
@Mar0ux Молодец, спасибо! Но, пожалуйста, отредактируйте свой ответ, потому что есть небольшая ошибка. imageWithData не будет принимать image.CGImage (это должен быть тип NSData), поэтому, вероятно, он должен быть [UIImage imageWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale ориентировка:UIImageOrientationUp]. - person KlimczakM; 25.07.2014
comment
@KlimczakM Готово. Спасибо! - person maroux; 31.07.2014

Обнаружено, что SDWebImage использует только приведенный ниже фильтр, чтобы определить, является ли изображение сетчаткой или нет (находится в SDWebImageCompat.m):

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

Потому что он искал только "@2x". (обратите внимание на точку) и только в том случае, если он попадал в конец строки, чтобы изображения с именами типа «my-image@2x~iphone.png» не определялись как сетчатка.

Обновлен код для поиска всего URL-адреса изображения для «@2x». Единственная проблема в том, что вы не можете использовать «@2x» где-либо еще в URL-адресе (но какой разработчик когда-либо использует такое соглашение об именах?):

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

Я также отправил запрос на вытягивание на странице SDWebImage GitHub (https://github.com/rs/SDWebImage/pull/370)

person JimmyJammed    schedule 25.04.2013