iOS Swift: как правильно уменьшить изображение?

Я использую AlamofireImage для загрузки и установки своего UIImage:

backdrop.af_setImageWithURL(downloadURL)

Изображение значительно больше, чем то, что я буду отображать, поэтому у меня проблема с алиасингом. Как я могу правильно изменить размер этого изображения?

Результаты:

введите здесь описание изображения


person mrmike    schedule 27.06.2016    source источник
comment
Можете ли вы рассказать нам, что вы сделали до сих пор, и это не работает, чтобы мы могли вам помочь. Потому что, как сейчас выглядит вопрос, его можно отнести к категории основанных на мнении и он не подходит для этого форума.   -  person Andrej    schedule 27.06.2016
comment
Я ничего не делал со сглаживанием, я не знаю, как это сделать. Мое изображение отображается отлично, за исключением алиасинга. @Андрей   -  person mrmike    schedule 27.06.2016
comment
В чем проблема? Большинство алгоритмов изменения размера, вероятно, дадут тот же эффект. Об общих алгоритмах изменения размера см. stackoverflow.com/a/28513086/1271826. Обычно мы изменяем размер, чтобы свести к минимуму воздействие на память, а не для смягчения изображения из-за изменения его размера.   -  person Rob    schedule 27.06.2016
comment
Кстати, в Alamofireimage уже есть методы масштабирования изображения, поэтому вам, вероятно, не нужно писать свои собственные .   -  person Rob    schedule 27.06.2016
comment
Я уже описал свою проблему, связанную с алиасингом, в меру своих возможностей, единственный способ, которым я могу это описать, - это то, что он выглядит слишком резким. Тонкие линии, расположенные близко друг к другу, выглядят неправильно. Я чувствую, что изображение должно быть мягче. Я использовал режим «Aspect Fit» в раскадровке, чтобы масштабировать изображение. Я опубликую фотографии до и после, используя принятое решение, чтобы вы могли видеть. @Роб   -  person mrmike    schedule 28.06.2016


Ответы (2)


Вы можете изменить размер изображения на любой размер, если у вас есть действительный UIImage:

func resizedImageWith(image: UIImage, targetSize: CGSize) -> UIImage {

    let imageSize = image.size
    let newWidth  = targetSize.width  / image.size.width
    let newHeight = targetSize.height / image.size.height
    var newSize: CGSize

    if(newWidth > newHeight) {
        newSize = CGSizeMake(imageSize.width * newHeight, imageSize.height * newHeight)
    } else {
        newSize = CGSizeMake(imageSize.width * newWidth,  imageSize.height * newWidth)
    }

    let rect = CGRectMake(0, 0, newSize.width, newSize.height)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    image.drawInRect(rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

По любым другим вопросам/модификациям обращайтесь к этому NShipster.

person Santosh    schedule 27.06.2016
comment
Согласованный! Да, когда мы устанавливаем scale на 0,0, тогда будет использоваться масштаб основного экрана, который составляет 2,0 или более для экранов Retina. Обновил мой ответ. - person Santosh; 27.06.2016
comment
Я бы также уменьшил его с помощью UIJPEGRepresentation(image, amountToScale0Through1) - person Sethmr; 28.06.2016
comment
@Sethmr - UIImageJPEGRepresentation не масштабирует. Все, что он делает, это преобразует UIImage в NSData (либо увеличивая ресурс, либо уменьшая его, но добавляя артефакты JPEG в процессе). Иногда вам нужно UIImageJPEGRepresentation, но в этом вопросе нет ничего, чтобы предположить, что это то, что нужно здесь. - person Rob; 28.06.2016
comment
Я уверен, что это уменьшает размер файла. Наверное, я неправильно понял, что нужно. - person Sethmr; 28.06.2016
comment
@sethmr - Да, вы можете использовать параметр качества ниже 1,0, чтобы уменьшить размер файла, но он не масштабирует изображение, а скорее применяет сжатие с потерями (т.е. ухудшает качество изображения, добавляя артефакты, едва заметные при значениях 0,8 или 0,9). , но визуально заметно при более низких значениях). Это полезно при попытке уменьшить размер изображения, которое, например, загружается в веб-службу, но не уменьшает использование памяти во время выполнения UIImage. Чтобы добиться экономии памяти во время выполнения, вам необходимо масштабировать изображение, как показано в ответе Сантоша (или использовать методы масштабирования Alamofireinage, которые делают то же самое). - person Rob; 28.06.2016

Вот ответ @Santosh в ObjC:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize {

    CGSize imageSize = image.size;
    CGFloat newWidth  = newSize.width  / image.size.width;
    CGFloat newHeight = newSize.height / image.size.height;
    CGSize newImgSize;

    if(newWidth > newHeight) {
        newImgSize = CGSizeMake(imageSize.width * newHeight, imageSize.height * newHeight);
    } else {
        newImgSize = CGSizeMake(imageSize.width * newWidth,  imageSize.height * newWidth);
    }

    CGRect rect = CGRectMake(0, 0, newImgSize.width, newImgSize.height);

    UIGraphicsBeginImageContextWithOptions(newImgSize, false, 0.0);

    [image drawInRect:rect];;

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}
person Jameson    schedule 22.06.2018