CollectionView [高分辨率] 图像上的 iOS 内存峰值

Posted

技术标签:

【中文标题】CollectionView [高分辨率] 图像上的 iOS 内存峰值【英文标题】:iOS Memory spikes on CollectionView [high resolution] images 【发布时间】: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 的合成应用程序。 【参考方案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) 还有助于减小文件大小。回复:处理时间,真的很快。不超过几毫秒,考虑到全分辨率图像的上传时间,非常方便。

以上是关于CollectionView [高分辨率] 图像上的 iOS 内存峰值的主要内容,如果未能解决你的问题,请参考以下文章

应用程序启动高分辨率图像

如何在 Xcode 的 Storyboard 中保持高分辨率图像而不使其像素化?

IBM Watson Machine Learning Accelerator 加速深度学习和大规模高分辨率的图像处理

如何获得高分辨率图像

武汉大学CVEO小组:一种基于卷积神经网络(CNN)的高分辨率遥感影像分类方法

高分辨率食道测压(HRM)