繁体   English   中英

使用 drawInRect 调整图片大小的内存

[英]the memory of using drawInRect to resize picture

最近我使用 PHAssets 替换了我项目中的旧资产。但是,当我使用我的应用程序缩放一些图片时,我发现它通常会崩溃。 我使用调试模式,发现是内存问题。 我使用下面的代码来调整图片大小

  +(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{
    CGSize sb = img.size;;
    if (img.size.height/img.size.width > hei/wid) {
        sb = CGSizeMake(wid,wid*img.size.height/img.size.width);
    }else{
        sb = CGSizeMake(img.size.width*hei/img.size.height,hei);
    }
    if (sb.width > img.size.width || sb.height > img.size.height) {
        sb = img.size;
    }
    UIImage* scaledImage = nil;
    UIGraphicsBeginImageContext(sb);
    [img drawInRect:CGRectMake(0,0, sb.width, sb.height)];
    scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    img = nil;
    return scaledImage;
}

代码时内存会增加50M左右

 [img drawInRect:CGRectMake(0,0, sb.width, sb.height)] 

运行,即使该方法已完成,它也不会被释放。 宽高为304*228,图片原始大小约为3264*2448,返回的图片为304*228;这意味着我最终想要的真实图片只是一个304*228大小的图片,但需要50 +M 内存.. 有没有办法释放 drawInRect: 函数占用的内存? (@autoreleasepool 不起作用 ~ 😢 😢)

加载图像时,iOS 通常不会解压缩它,直到它真正需要。 因此,您传递给函数的图像很可能是 iOS 以压缩状态保存在内存中的 JPEG 或 PNG 图像。 绘制它的那一刻,它将首先解压缩,因此内存显着增加。 我预计会增加 3264 x 2448 x 4 = 35MB(而不是 50MB)。

为了再次摆脱内存,您将确保释放对传递给函数的图像的所有引用。 所以问题不在您在问题中显示的代码之外。

要获得更具体的答案,您需要显示适用于原始图像的所有代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM