如何在运行时正确压缩UIImages

问题描述 投票:4回答:2

我需要加载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的任何建议都可以节省生命!!

谢谢

ios objective-c xcode swift uiimage
2个回答
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)
}

0
投票

出现崩溃并看到如此高的内存使用量的原因是,您错过了对UIGraphicsEndImageContext();的调用,因此您正在疯狂地泄漏内存。

对于每次呼叫UIGraphicsBeginImageContextWithOptions,请确保您有一个呼叫UIGraphicsEndImageContext (after UIGraphicsGetImage*)

此外,您应该使用@autorelease换行(假设您使用的是ARC),否则,如果您正在快速处理图像,则仍然会发生内存不足的崩溃。

这样做吧:

@autorelease {
  UIGraphicsBeginImageContextWithOptions(...);
  ..
  something = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
}
© www.soinside.com 2019 - 2024. All rights reserved.