使用drawInRect调整图片大小的内存
the memory of using drawInRect to resize picture
最近我使用 PHAssets 替换我 project.However 中的旧资产,当我使用我的应用程序缩放一些图片时,我发现它通常会崩溃。
我用debug模式,发现是内存问题。
我使用下面的代码调整图片大小
+(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)。
要再次清除内存,您将确保释放对传递给函数的图像的所有引用。所以问题出在你在问题中显示的代码之外。
要获得更具体的答案,您需要显示所有适用于原始图像的代码。
最近我使用 PHAssets 替换我 project.However 中的旧资产,当我使用我的应用程序缩放一些图片时,我发现它通常会崩溃。 我用debug模式,发现是内存问题。 我使用下面的代码调整图片大小
+(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)。
要再次清除内存,您将确保释放对传递给函数的图像的所有引用。所以问题出在你在问题中显示的代码之外。
要获得更具体的答案,您需要显示所有适用于原始图像的代码。