【问题标题】:the memory of using drawInRect to resize picture使用drawInRect调整图片大小的内存
【发布时间】:2016-12-16 12:10:18
【问题描述】:

最近我在我的项目中使用 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 objective-c image phasset


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。代码是这样的:(我将我的代码添加到下面的评论中以便更好地阅读)
    • 上面的代码在我的回答中,刚才我尝试使用“UIImage* ti = [pv.image.image copy];”而不是“UIImage* ti = pv.image.image;”,但它不起作用;看来复制对象和原始对象链接到同一个图像,如果绘制图像,它会增加内存,但是原始对象没有设置为空闲,所以内存不会被释放;有什么解决办法这种情况(UIImageView对象不需要35M版本,但是我用draw方法把它拉到35M,画完后怎么把35M版本调小)
    • 看来我不应该用3264*2448尺寸的图片,我应该先用小号的,这样抽奖不会增加那么多~~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多