我需要加载4张图像以进行同时编辑。当我从用户库加载它们时,内存超过500mb并崩溃。
这里是我进行任何压缩尝试之前来自原始分配转储的日志:
代码:
var pickedImage = UIImage(data: imageData)
仪器:
我已经阅读了几篇有关压缩UIImage的文章。我曾尝试减少UIImage:
新代码:
var pickedImage = UIImage(data: imageData, scale:0.1)
仪器:
减小UIImage的大小没有效果?!很奇怪。
所以现在我尝试基于完整的UIImage创建JPEG压缩
新代码:
var pickedImage = UIImage(data: imageData)
var compressedData:NSData = UIImageJPEGRepresentation(pickedImage,0)
var compressedImage:UIImage = UIImage(data: compressedData)!//this is now used to display
仪器:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9UVEJ2ZC5wbmcifQ==” alt =“在此处输入图像描述”>
现在,我怀疑是因为我正在转换仍在加载的图像。而且由于这一切都是在PHImageManager的回调中发生的,因此我需要一种从NSData创建压缩的UIImage的方法,但是将小数位设置为0.1没什么。
所以有关如何直接从NSData压缩此UIImage的任何建议都可以节省生命!!
谢谢
我最终在处理图像之前对缩小尺寸进行了硬编码。这是代码:
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:CGSizeMake(CGFloat(asset.pixelWidth), CGFloat(asset.pixelHeight)), contentMode: .AspectFill, options: options)
{
result, info in
var minRatio:CGFloat = 1
//Reduce file size so take 1/2 UIScreen.mainScreen().bounds.width/2 || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height/2)
{
minRatio = min((UIScreen.mainScreen().bounds.width/2)/(CGFloat(asset.pixelWidth)), ((UIScreen.mainScreen().bounds.height/2)/CGFloat(asset.pixelHeight)))
}
var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
result.drawInRect(CGRectMake(0, 0, size.width, size.height))
var final = UIGraphicsGetImageFromCurrentImageContext()
var image = iImage(uiimage: final)
}
出现崩溃并看到如此高的内存使用量的原因是,您错过了对UIGraphicsEndImageContext();
的调用,因此您正在疯狂地泄漏内存。
对于每次呼叫UIGraphicsBeginImageContextWithOptions
,请确保您有一个呼叫UIGraphicsEndImageContext (after UIGraphicsGetImage*)
。
此外,您应该使用@autorelease
换行(假设您使用的是ARC),否则,如果您正在快速处理图像,则仍然会发生内存不足的崩溃。
这样做吧:
@autorelease {
UIGraphicsBeginImageContextWithOptions(...);
..
something = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}