这是一个可以编辑的媒体的界面 可以多选 编辑分享保存 媒体是从硬件端传过来的

因为图片比较小 所以我做的第一步就是对原图进行压缩成缩略图 只有在当前界面才会显示缩略图 分享保存点击查看都是用的原图

thumbMediaData = UIImageJPEGRepresentation(picture, FILE_ZIP_RATIO);

NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];            
// 将 file:// URL 转换为路径字符串
NSString *filePath = [thumbnailUrl path];
UIImage *thumbnailImage = [UIImage imageWithContentsOfFile:filePath];

// 设置图片,如果图片不存在则显示占位图
if (thumbnailImage) {
  videocell.imageView.image = thumbnailImage;
} else {
  videocell.imageView.image = [UIImage imageNamed:@"media_image"]; // 或者加载失败的图
}

起初我是通过直接加载图片 发现内存比较高 而且上下滑动的时候 很卡 随后我就发现这个加载图片都是在主线程直接加载 搞清楚原因之后 我就开始着手优化这个,

SDWebimage 这个库我们在加载网络图片的时候都会用到 实际上 用它来加载本地图片一样的好用

然后我就又尝试了一版

NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];
[videocell.imageView sd_setImageWithURL:thumbnailUrl placeholderImage:nil];

这样处理之后呢 滑动起来确实是比较流畅了 因为它把加载放在了子线程 但是马上我就发现了 当持续滑动的时候 它的瞬时内存占用 会很大 基本是上面直接加载的图片方式的2倍,虽然说这样可以滑动卡顿的问题 但是瞬时内存大的问题 还是存在,于是于是 我还得继续优化 毕竟现在图片还不多 大概就70多张 已经占用了我接近1G的瞬时内存,后面复用的过程中 实际占用还是会回落 但是还是会比普通的占用要大很多

好了 接下来就是终极解决方案了

CGSize targetSize = CGSizeMake(SCALE_WIDTH(300), SCALE_WIDTH(300));
SDImageResizingTransformer *transformer = [SDImageResizingTransformer transformerWithSize:targetSize scaleMode:SDImageScaleModeAspectFill];
NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];
[videocell.imageView sd_setImageWithURL:thumbnailUrl placeholderImage:nil options:0 context:@{SDWebImageContextImageTransformer: transformer}];

从 SDWebImage 5.10.0 版本开始,官方提供了一个内置的 SDImageResizingTransformer,专门用于在下载和缓存之前调整图片大小。这是最直接、最推荐的方法。

下面来说下这个类的工作原理

工作原理:

1.SDWebImage 在后台线程获取到原始图片数据后,在解码之前,会检查 context 中是否有 SDWebImageContextImageTransformer。

2.如果找到了 transformer,它就会使用这个转换器(在这里是 SDImageResizingTransformer)来处理原始图片。

3.transformer 会生成一个符合 targetSize 的新图片。

4.SDWebImage 会将这个转换后的小图存入内存缓存和磁盘缓存。

5.最终显示在 UIImageView 上的也是这个小图。

当然也有更加底层的方案

使用 SDWebImageContextImageThumbnailPixelSize 上下文选项

这个选项会直接传递给 SDWebImage 底层的解码器。解码器在调用 ImageIO 的 CGImageSourceCreateThumbnailAtIndex 函数时,会将 thumbnailPixelSize 作为 kCGImageSourceThumbnailMaxPixelSize 参数的值。这实现了在解码时就生成指定大小的缩略图,效率非常高。

这里我就直接用官方的SDImageResizingTransformer类实现了 最终测试出来 内存占用基本不超过100 确实很让人满意 不过加载的图片因为是从我已经处理的缩略图里面 再次压缩得到的 会相对来说比较模糊 大家可以根据自己能接受的程度 动态调整targetSize的大小,调到一个总体满意的程度即可