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

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

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 底层的解码器。解码器在调用 ImageIOCGImageSourceCreateThumbnailAtIndex 函数时,会将 thumbnailPixelSize 作为 kCGImageSourceThumbnailMaxPixelSize 参数的值。这实现了在解码时就生成指定大小的缩略图,效率非常高。

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