【问题标题】:How To Properly Compress UIImages At Runtime如何在运行时正确压缩 UIImages
【发布时间】:2014-10-30 18:22:10
【问题描述】:

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

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

代码:

var pickedImage = UIImage(data: imageData)

仪器:

我已经阅读了几篇关于压缩 UIImages 的文章。我已经尝试减少 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

仪器:

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

因此,任何关于如何直接从 NSData 压缩此 UIImage 的建议都可以挽救生命!!!

谢谢

【问题讨论】:

  • 你试过用link吗?
  • 是的,那是老派,但谢谢(它矫枉过正)。我确实想出了另一个解决方案,我明天可以发布。

标签: ios objective-c xcode swift uiimage


【解决方案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)
}

【讨论】:

【解决方案2】:

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

每次致电UIGraphicsBeginImageContextWithOptions,请确保您已致电UIGraphicsEndImageContext (after UIGraphicsGetImage*)

另外,您应该使用 @autorelease 进行包装(我假设您使用的是 ARC),否则如果您正在快速处理图像,您仍然会出现内存不足的崩溃。

这样做:

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

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2015-11-07
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多