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 加速深度学习和大规模高分辨率的图像处理