簡體   English   中英

在內存限制下調整UIImage的大小

[英]Resize UIImage under memory constraints

我從Web資源(> 300MBs)下載了大量的UIImage,當我嘗試渲染時,由於內存導致應用程序崩潰。 我正在嘗試使用以下代碼調整圖像的大小:

+ (UIImage *)imageWithImage:(UIImage *)image scaled:(float) scale {
    //UIGraphicsBeginImageContext(newSize);
    CGSize size = (CGSize){scale * image.size.width, scale * image.size.height};
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

正如您可能已經猜到的那樣,問題在於這實際上需要渲染圖像,從而導致相同的崩潰。 有沒有辦法在不給系統帶來如此大內存壓力的情況下調整大圖像的大小?

問題是您將圖像保存在內存中。 將其下載到磁盤,並使用ImageIO框架直接從磁盤讀取“縮略圖”(較小的大小),而不必將完整大小的圖像保存在內存中。

您可以嘗試這個+ (UIImage *)decodedImageWithImage:(UIImage *)image maxSize:(NSInteger) maxSize. SDWebImage代碼

#define MAX_IMAGE_SIZE 1000
@implementation UIImage (ForceDecode)
+ (CGSize) originalSize:(UIImage*) image
{
    return  CGSizeMake(CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage));
}
+ (UIImage *)decodedImageWithImage:(UIImage *)image {
    return [self decodedImageWithImage:image maxSize:MAX_IMAGE_SIZE];
}
+ (UIImage *)decodedImageWithImage:(UIImage *)image maxSize:(NSInteger) maxSize{
    if (image.images) {
        // Do not decode animated images
        return image;
    }

    CGImageRef imageRef = image.CGImage;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
    imageSize = [self checkMaxImageSize:imageSize maxSize:maxSize];
    CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize};

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);

    int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask);
    BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone ||
                        infoMask == kCGImageAlphaNoneSkipFirst ||
                        infoMask == kCGImageAlphaNoneSkipLast);

    // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB.
    // https://developer.apple.com/library/mac/#qa/qa1037/_index.html
    if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) {
        // Unset the old alpha info.
        bitmapInfo &= ~kCGBitmapAlphaInfoMask;

        // Set noneSkipFirst.
        bitmapInfo |= kCGImageAlphaNoneSkipFirst;
    }
    // Some PNGs tell us they have alpha but only 3 components. Odd.
    else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) {
        // Unset the old alpha info.
        bitmapInfo &= ~kCGBitmapAlphaInfoMask;
        bitmapInfo |= kCGImageAlphaPremultipliedFirst;
    }

    // It calculates the bytes-per-row based on the bitsPerComponent and width arguments.
    CGContextRef context = CGBitmapContextCreate(NULL,
                                                 imageSize.width,
                                                 imageSize.height,
                                                 CGImageGetBitsPerComponent(imageRef),
                                                 0,
                                                 colorSpace,
                                                 bitmapInfo);
    CGColorSpaceRelease(colorSpace);

    // If failed, return undecompressed image
    if (!context) return image;

    CGContextDrawImage(context, imageRect, imageRef);
    CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context);

    CGContextRelease(context);

    UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation];
    CGImageRelease(decompressedImageRef);
    return decompressedImage;
}

+ (CGSize) checkMaxImageSize:(CGSize) size maxSize:(NSInteger) max
{
    CGFloat whRatio = size.width / size.height;
    if (size.height > max || size.width > max) {
        if (size.height > size.width) {
            size.width = max * whRatio;
            size.height = max;
        }else{
            size.width = max ;
            size.height = max / whRatio;
        }
    }
    return size;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM