当前位置: 首页 > news >正文

iOS_图片加载优化

文章目录

    • 1、直接加载
    • 2、图片采样
    • 3、采样 vs 缩小图片

因为下载图片前只有url,所以无法预测下载到的图片的大小。如果不进行优化处理,加载到大图就会导致内存飙升,图片足够大或数量足够多时还会有 OOM 的风险。
所以终端必须对图片的加载进行优化处理。


如这张图:

  • 地址

  • 文件大小:3.4M


1、直接加载

加载图片前 demo 项目内存占用为:25.5M
若下载后直接加载到内存,总内存大小为:84.2M,占用了 58.7M:


2、图片采样

对图片进行采样:

// 1. 创建 CGImageSource 对象
// kCGImageSourceShouldCache 是否需要解码缓存
let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL,imageSourceOptions) else {print("create image source error")return
}
// 2. 计算采样像素
let maxDimensionInPixels = max(size.width, size.height) * scale
// 3. 配置采样参数
let sampleOptions = [kCGImageSourceCreateThumbnailFromImageAlways: true,kCGImageSourceShouldCacheImmediately: true, // 进行解码和缓存kCGImageSourceCreateThumbnailWithTransform: true,kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary
// 4. 创建缩略图
guard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, sampleOptions) else {print("create thumbnail image error")return
}
self.imageView.image = downsampledImage

加载到内存之后,总内存为 27.2M,占用了 2.2 M:


3、采样 vs 缩小图片

缩小处理代码如下:

let renderer = UIGraphicsImageRenderer(size: size)
let renderImage = renderer.image { context inimage.draw(in: CGRect(origin: .zero, size: size))
}
self.imageView.image = renderImage

但根据苹果工程师 Kyle Howarth 所说,由于内部坐标系的变换,这样做效果也不会如预想的那么好。内部坐标空间变换是昂贵的。
建议使用采样,ImageIO可以在不污染内存的情况下读取图像尺寸和元数据信息 ImageIO可以调整图像的大小,但只以调整后的图像为代价

下采样相比于缩小图片是更适合的优化方式。


参考:
iOS Memory Deep Dive
iOS 中的图像优化
图像优化


http://www.mrgr.cn/news/49407.html

相关文章:

  • 考研C语言程序设计_语法相关(持续更新)
  • 2024系统架构师---试题二论软件维护方法及其应用
  • HTML(七)表格
  • AVL树实现
  • 020 elasticsearch7.10.2 elasticsearch-head kibana安装
  • 【优化方案】Java 将字符串中的星号替换为0-9中的数字,并返回所有可能的替换结果
  • 决策树和集成学习
  • 使用ChatGPT润色学术论文,只需4个顶级提示词指令,先人经验,直接高效使用
  • 深入探讨Python网络爬虫的实现与应用
  • ES5求职经典 JavaScript篇章
  • 优先算法1--双指针
  • 代理IP如何广告验证的效率和成功率?
  • 新品牌Sesame Street《芝麻街》商标版权双维权,尚未TRO
  • 在顺序结构和链式结构的线性表上实现顺序检索算法
  • Ubuntu20.04同时安装ROS1和ROS2,如何选择ROS1 or ROS2
  • CVESearch部署、使用与原理分析
  • 使用mnist数据集和LeakyReLU高级激活函数训练神经网络示例代码
  • Springboot 使用【过滤器】实现在请求到达 Controller 之前修改请求体参数和在结果返回之前修改响应体
  • 25.1 降低采集资源消耗的收益和无用监控指标的判定依据
  • 7-2 试试多线程