如何在运行时正确压缩UIImages

时间:2014-10-30 18:22:11

标签: ios objective-c xcode swift uiimage

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

在进行任何压缩尝试之前,这是来自原始分配转储的日志:

代码:

var pickedImage = UIImage(data: imageData)

仪器: enter image description here

我已经阅读了几篇关于压缩UIImages的帖子。我试过减少UIImage:

新守则:

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

仪器: enter image description here

减少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

仪器:

enter image description here

现在,我怀疑是因为我正在转换它仍在加载的图像。由于这一切都发生在来自PHImageManager的回调中,我需要一种从NSData创建压缩UIImage的方法,但是将比例设置为0.1并没有。

所以关于如何从NSData压缩这个UIImage的任何建议都会挽救生命!!!

由于

2 个答案:

答案 0 :(得分:1)

我最终在处理图像之前硬编码了尺寸缩小。这是代码:

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)
                }

答案 1 :(得分:0)

您崩溃并看到如此高的内存使用率的原因是因为您缺少对UIGraphicsEndImageContext()的调用; - 所以你像疯了一样泄漏记忆。

每次调用UIGraphicsBeginImageContextWithOptions时,请确保调用UIGraphicsEndImageContext(在UIGraphicsGetImage *之后)。

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

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