Перенаправленный URL-адрес загруженной формы с изображением имеет неправильный размер

#ios #image #swift #retina-display #sdwebimage

#iOS #изображение #swift #сетчатка-дисплей #sdwebimage

Вопрос:

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

Я добавил вывод журнала, который выводит размер изображения. Выходные данные для изображения, загруженного с URL-адреса перенаправления, составляют 88×88, а для изображения с исходного URL-адреса — 44×44. Изображение имеет размер 88×88 пикселей. Я использую симулятор с дисплеем retina, поэтому я думаю, что правильный размер должен быть 44×44 точки. URL-адрес перенаправления определенно перенаправляет на правильное изображение, я проверил это в браузере. Как размер может отличаться для одного и того же изображения?

Мой код:

 let url=NSURL(string:"http://redirectionurl/asdf")
//  let url=NSURL(string:"http://originalurl.com/image@2x.png")


var managerCompletedBlock:(UIImage!, NSError!,SDImageCacheType,Bool) -> Void = {
            image,error,cacheType,finished in
            if(finished){
                println("finished")
                if let e = error
                {
                    if let s = e.localizedDescription
                    {
                        println(s)
                    }
                }
                log.debug("size: (image.size.width) (image.size.height)")
                imageToLoad.icon = image
            } else {
                println("fail!!!!");
            }
        }

self.imageManager.downloadWithURL(url, options: SDWebImageOptions.HighPriority, progress: nil, completed: managerCompletedBlock)
  

Я сделал снимок экрана. Маркер с левой стороны загружается с исходного URL-адреса, а маркер с правой стороны загружается с URL-адреса перенаправления: http://bayimg.com/JAOPmaAFp

Комментарии:

1. Пожалуйста, загрузите оба изображения (исходное и перенаправленное) на свой компьютер и проверьте, были ли они отправлены с одинаковыми заголовками и одинаковым содержимым файла.

2. @Alexander: оба совпадают, за исключением имени файла. Изображение с URL-адреса перенаправления не имеет «@2x» в имени файла. Может ли это быть проблемой?

3. Почему понижающий голос? Есть ли что-то, что я должен изменить в своем вопросе?

Ответ №1:

SDWebImage имеет следующий код в SDWebImageCompat.m в методе SDScaledImageForKey:

     if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        CGFloat scale = 1.0;
        if (key.length >= 8) {
            // Search @2x. at the end of the string, before a 3 to 4 extension length (only if key len is 8 or more @2x.   4 len ext)
            NSRange range = [key rangeOfString:@"@2x." options:0 range:NSMakeRange(key.length - 8, 5)];
            if (range.location != NSNotFound) {
                scale = 2.0;
            }
        }

        UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation];
        image = scaledImage;
    }
  

Вы заметите, что он обнаружил стандартное «@ 2x» в имени файла и соответствующим образом масштабирует изображение. Похоже, что ключ, который он проверяет на @2x, по умолчанию просто настраивается по переданному URL-адресу, прежде чем произойдет какое-либо перенаправление.

Если то, что у вас сейчас работает, я бы, вероятно, просто изменил ваш URL-адрес перенаправления, чтобы он заканчивался на «@2x.png». Кроме того, с первого взгляда кажется, что вы можете «перехватить» ключ кэша URL, предоставив свой собственный cacheKeyFilter (проверьте README для получения дополнительной информации.) Вероятно, это не предназначено для этой цели, но я предполагаю, что если бы вы предоставили фильтр ключей кэша, который использовал ключ, чтобы всегда добавлять «@2x.png» в конец, это, вероятно, обеспечило бы согласованное поведение масштабирования.