iOS 图片处理内存优化ImageIO

参考:
[ WWDC2018 ] - 深入解析iOS内存 iOS Memory Deep Dive
[ WWDC2018 ] - 图像最佳实践 Image and Graphics Best Practices
谈谈 iOS 中图片的解压缩

图片原理小科普

不管是 JPEG 还是 PNG 图片,都是一种压缩的位图图形格式。
要在屏幕上渲染出图片,必须将压缩后的数据进行解码,拿到原始像素数据,才能进行后续绘制操作。
而解压过程是一个大量占用CPU资源的工作。
原始像素数据大小和图片文件大小无关,和图片尺寸正相关。
原始像素数据大小 = 图片像素长 * 图片像素宽 * 像素格式。

图片加载处理

  1. [UIImage imageNamed:@""]

常用与加载Assets.xcassets内的小图片吗,会有缓存。

  1. [UIImage imageWithContentsOfFile:path]

常用语加载文件夹内图片,无缓存。

  1. ImageIO的方式
    加载:在Decode前插入创建缩略图的过程。即对image进行预处理,采用缩小解码后Image Buffer的size的方式,减少内存的占用。
    缩放:ImageIO 能够在不产生 dirty memory 的情况下读取到图片尺寸和元信息,其内存损耗等于缩减后的图片尺寸产生的内存占用。

实践对比

 测试:iPhone7 11.2.6系统下,Xcode9.4
 本地文件148KB的jpg图片:
     通过[UIImage imageWithContentsOfFile:path]加载内存占用为15.7MB左右,
     通过ImageIO加载,内存占用为13.2MB左右
 对比sdwebImage:
     加载本地图片4张:
         通过SDWebImage,内存占用为15MB左右
         通过ImageIO加载,内存占用为14MB左右
     加载网络图片:
          通过SDWebImage,内存占用为14MB左右
          通过ImageIO加载,内存占用为14.5MB左右

注意

API为CF库,需注意内存的释放问题。
最佳实践:创建串行队列,在串行队列内通过ImageIO获取处理图片,切回主队列进行UI更新。

Demo

测试-github

你可能感兴趣的:(iOS 图片处理内存优化ImageIO)