【问题标题】:iOS Memory spikes on CollectionView [high resolution] imagesCollectionView [高分辨率] 图像上的 iOS 内存峰值
【发布时间】:2018-08-10 12:21:54
【问题描述】:

我有一个 CollectionView,其中包含具有 UIImageView 的单元格。列表中的某些图像具有 3000 x 2000 以上的高分辨率。我正在使用 AlamofireImage 库来显示和缓存图像,但它仍然有巨大的峰值。我试过做

let filter = AspectScaledToFillSizeFilter(size: imageView.frame.size)
imageView.af_setImage(withURL: url, filter: filter)

这并没有太大的变化。

有没有更好的方法在下载图像时调整/降级分辨率,但在将其显示为 iOS 内存峰值之前,更多是因为分辨率而不是图像文件的实际大小。

【问题讨论】:

  • 请尝试在代码块周围使用自动释放池。让我知道它是否适合您。
  • @iChris 我试过了,但没有帮助。在 300-400 MB 之前仍然会出现 1 秒的内存峰值。
  • 我删除了 nuke 标签,因为它是用于 VFX 的合成应用程序。

标签: ios sdwebimage alamofireimage kingfisher


【解决方案1】:

斯威夫特 4.1

这就是我调整图像大小的方式。您可以在显示之前对其进行处理。

// Resize to ~1.5Kx2K resoultion and compress to <200KB (JPEG 0.2)
private func resizePhoto(_ originalPhoto: UIImage) -> UIImage? {
    var size: CGSize
    let scale = UIScreen.main.scale
    if originalPhoto.size.width > originalPhoto.size.height { // Landscape
        size = CGSize(width: 2016/scale, height: 1512/scale)
    } else { // Portrait
        size = CGSize(width: 1512/scale, height: 2016/scale)
    }
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
    originalPhoto.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    let resizedPhoto = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let scaledPhotoData = UIImageJPEGRepresentation(resizedPhoto!, 0.2)
    //print(">>> Resized data size: \(scaledPhotoData!.count)")
    return UIImage(data: scaledPhotoData)
}

【讨论】:

  • 1. UIImage 扩展不是更好吗? 2.知道处理一张图片需要多少毫秒吗? 3. 这不就是全部调整为 1.5Kx2K 吗?
  • 嗨@AkashPopat。将此添加到扩展是一个好主意,我也可以将所需的分辨率作为参数传递。在这种情况下,我想将图像大小限制在 1.5K 到 2K 像素,并将整体文件大小限制在 200Kbytes 以内(它们都是用背面相机拍摄的)。除了降低分辨率外,压缩因子 (0.2) 还有助于减小文件大小。回复:处理时间,真的很快。不超过几毫秒,考虑到全分辨率图像的上传时间,非常方便。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2017-08-23
  • 2014-11-20
  • 2012-05-08
  • 2013-08-25
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多