如何在iOS共享扩展中缩小图像大小后再上传

3

我正在构建一个分享扩展,并需要在上传之前将大型照片缩放为较小的尺寸。

我正在使用来自如何调整大小并保持其宽高比的UIImage的代码:

- (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共享扩展来分享来自非iPhone来源(如相机的高分辨率照片)的照片。

显然,上传一个20MP/8MB的照片而不进行缩小是不可取的。如何以更少的内存使用量将其缩小?


除非您的newSize是一个正方形,否则存在算法问题:您只考虑了原始比例if( image.size.width > image.size.height ),而没有考虑目标比例(newSize.width / newSize.height),因此可能会增加宽度或高度。这段代码的来源应该被修复或者被投票降低评分。 - undefined
2个回答

3

我和你一样也遇到了同样的问题。缩小图片操作导致我的内存使用量增加了800MB,有时应用程序会因为内存使用过度而崩溃。我采用的解决方案是用新的 iOS 10 UIGraphicsImageRendererFormat 替换 UIGraphicsBeginImageContextWithOptions。以下是我的 Swift 代码:

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))
        }
    }
}

0

看起来你的图像和缩放后的图像在内存中同时存在,这两个图像可能都占用了太多的内存。在创建缩放后的图像之前,你可以尝试释放原始图像:

//code

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

//code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接