2

Я создаю расширение для общего доступа, и перед загрузкой в ​​расширение моего контента мне нужно масштабировать большие фотографии до меньшего размера.Как масштабировать изображение в iOS Share Расширение перед загрузкой

Я использую этот код из How to resize an UIImage while maintaining its Aspect Ratio:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize { 
    CGSize scaledSize = newSize; 
    float scaleFactor = 1.0; 
    if(image.size.width > image.size.height) { 
     scaleFactor = image.size.width/image.size.height; 
     scaledSize.width = newSize.width; 
     scaledSize.height = newSize.height/scaleFactor; 
    } 
    else { 
     scaleFactor = image.size.height/image.size.width; 
     scaledSize.height = newSize.height; 
     scaledSize.width = newSize.width/scaleFactor; 
    } 

    UIGraphicsBeginImageContextWithOptions(scaledSize, NO, 0.0); 
    CGRect scaledImageRect = CGRectMake(0.0, 0.0, scaledSize.width, scaledSize.height); 
    [image drawInRect:scaledImageRect]; 
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return scaledImage; 
} 

Однако, когда я пытаюсь свернуть большое изображение из моей фотографии библиотеки (5415x3610 в этом случае выстрел с DSLR) он выходит из строя из-за давления памяти. Хотя это похоже на угловой случай, мое приложение сильно зависит от расширения для iOS Share для обмена фотографиями из источников, отличных от iPhone, например, фотографии с высоким разрешением с камеры.

Очевидно, что загрузка 20-мегабайтной/8 МБ фотографии без масштабирования не является вариантом. Как уменьшить масштаб с меньшим использованием памяти?

+0

Если ваш NewSize не является квадратом, есть проблема алгоритма: вы смотрите только в оригинальном соотношении 'если (image.size.width> image.size.height) ', а не в целевом отношении (' newSize.width/newSize.height'), поэтому вы потенциально увеличиваете ширину или высоту. Источник этого кода должен быть фиксированным или уменьшенным. –

ответ

0

Кажется, что ваше изображение и scaledImage находятся в памяти сразу, и оба изображения могут использовать их много. Вы можете попытаться отпустить свое изображение перед созданием scaledImage:

//code 

[image drawInRect:scaledImageRect]; 
image = nil; 
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

//code 
1

У вас была такая же проблема, как и вы. Операция масштабирования увеличила использование моей памяти на + 800 МБ, и время от времени приложение разбилось из-за использования памяти. То, что сработало для меня, заменяло UIGraphicsBeginImageContextWithOptions новым ios 10 UIGraphicsImageRendererFormat. Вот мой скор код масштабирования исполняющего изображения:

extension UIImage { 
    func scaled(to size: CGSize) -> UIImage { 
     let format = UIGraphicsImageRendererFormat() 
     format.scale = scale 
     let renderer = UIGraphicsImageRenderer(size: size, format: format) 
     return renderer.image { (_) in 
      draw(in: CGRect(origin: .zero, size: size)) 
     } 
    } 
} 
Смежные вопросы