如何在运行时正确压缩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(); }