如何在运行时正确压缩UIImage

我需要加载4个图像进行同步编辑。 当我从用户库中加载它们时,内存超过500MB并崩溃。

这是来自原始分配转储的日志,然后再进行任何压缩尝试:

码:

var pickedImage = UIImage(data: imageData) 

仪器: 在这里输入图像说明

我已经阅读了几个关于压缩UIImage的post。 我曾尝试减lessUIImage:

新代码:

 var pickedImage = UIImage(data: imageData, scale:0.1) 

仪器: 在这里输入图像说明

减lessUIImage的规模没有效果?! 很奇怪。

所以现在我试图根据完整的UIImage创buildJPEG压缩

新代码:

 var pickedImage = UIImage(data: imageData) var compressedData:NSData = UIImageJPEGRepresentation(pickedImage,0) var compressedImage:UIImage = UIImage(data: compressedData)!//this is now used to display 

仪器:

在这里输入图像说明

现在,我怀疑因为我正在转换它仍然被加载的图像。 由于这是所有发生在PHImageManager的callback,我需要从NSData创build一个压缩的UIImage的方式,但设置比例为0.1没有什么。

所以任何关于如何从NSData压缩这个UIImage的build议将是拯救生命!

谢谢

在处理图像之前,我最终编写了大小缩减的硬编码。 这里是代码:

 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的调用(在UIGraphicsGetImage *之后)。

此外,你应该包装在@autorelease(我假设你正在使用ARC),否则,如果你正在快速处理图像,你仍然会有内存不足的崩溃。 像这样做:

 @autorelease { UIGraphicsBeginImageContextWithOptions(...); .. something = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); }