聊聊图片压缩的优化

简介: 聊聊图片压缩的优化

本篇文章主要是聊聊压缩的优化,尽量不贴代码,文章结构也尽量保证短小。

比例压缩


比例压缩是一种非常常见的算法,主要是通过设置


BitmapFactory.Options.inSampleSize 来压缩,我们可以自己设置压缩的比例,也可以根据目标控件的宽、高度来等比设置比例,压缩效率一般,所以我们时常会配合质量压缩一块来压缩。

质量压缩


拿到等比压缩过后的图片,我们可以通过 bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos) 来实现质量压缩,我们主要关注以下俩个参数:


1、CompressFormat  是我们要压缩的格式,包含的格式有:

  • JPEG:压缩为 JPEG 格式,压缩质量随 quality 改变,一般都用它
  • PNG:压缩为 PNG 格式,PNG 是无损的,他会忽略 quality 值,一般不用
  • WEBP:压缩为 WEBP 格式,压缩质量随 quality 改变,但从 Android Q 开始,quality=100 时,将会采用无损压缩,一般不用

2、quality 是我们要压缩的质量,压缩区间为 0 ~ 100,一般我们会设置压缩质量为 80.

色值压缩


色值压缩通过 BitmapFactory.OptionsinPreferredConfig 来设置,对应的 config 有:


  • ALPHA_8
  • RGB_565
  • ARGB_4444
  • ARGB_8888
  • RGBA_F16
  • HARDWARE


这几种配置都是通过设置单个像素点的位数来改变图片大小,比如 ARGB_8888 和 RGB_565,前者采用 4*8 = 32 位来表示一个像素,后者采用 5+6+5 = 16 位来表示一个像素,在质量大小上面,RGB_565 比 ARGB_8888 小了 1 倍。

算法压缩


前面讲了这么多,都逃脱不了压缩的界定值问题,就是到底设置什么样的值,既能保证图片清晰,还能保证大小压缩已经到了极致。这个地方又要引入一个第三方框架,那就是 Luban,Luban 的精华部分就是实现了一套 inSampleSize 的算法计算,保证图片的压缩是极致的,具体代码可以查看 computeSize 方法,这里就不贴代码了。

Native 压缩



虽然 Luban 将压缩发挥了极致,但毕竟只是计算 inSampleSize,相比较 native 的 libjpeg 而言,压缩又进了一个等级。关于 libjpeg 的 分析可以看我这篇文章《JNI 之 Libjpeg 分析》,Luban 的作者也做了一个基于 libjpeg 的库—— Luban-Turbo

问题


上面的所有算法,都有一个致命问题 —— 压缩前需要加载进内存。对于大图而言,100M 的图片加载进内存会导致内存拼命增长,发生 OOM 会导致应用进程崩溃。

方案


压缩前需要加载进内存这个貌似无法解决,但我们可以另辟新径,开个新的进程出来,专门来处理图片压缩,即使加载进的图片非常大导致进程崩溃,也不会影响到主进程。

对于开个新进程来处理图片压缩问题,我想到的一个比较简单的方案是创建一个专门处理压缩的 Activity,并设置 process 为单独的一个进程:


<activity
      android:name=".ProcessActivity"
      android:process=":compress"/>
复制代码


如果体验想更佳的话,我们可以给 activity 设置 dialog theme,然后布局设置为一个 loading 加载框等待压缩,压缩完成后,setResult 将压缩结果带回:


image.png


目录
相关文章
|
7月前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
7月前
|
存储 缓存 编解码
实现iOS平台的高效图片缓存策略
【4月更文挑战第23天】在移动应用开发领域,尤其是图像处理密集型的iOS应用中,高效的图片缓存策略对于提升用户体验和节省系统资源至关重要。本文将探讨一种针对iOS平台设计的图片缓存方案,该方案通过结合内存缓存与磁盘缓存的多层次结构,旨在优化图片加载性能并降低内存占用。我们将深入分析其设计理念、核心组件以及在实际场景中的应用效果,同时对比其他常见缓存技术的优势与局限。
|
7月前
|
前端开发 算法 JavaScript
如何优化前端性能:探索图片压缩与延迟加载技术
本文深入探讨了前端性能优化中的关键问题:图片压缩与延迟加载技术。通过介绍图片压缩的原理和方法,并结合实例说明了如何有效减少图片大小、提升加载速度;同时,详细解析了延迟加载技术的实现原理及其在提高页面加载性能中的作用,为前端开发者提供了实用的优化方案。
|
前端开发 JavaScript C++
前端优化指南:我们该怎么去压缩图像?
前端优化指南:我们该怎么去压缩图像?
241 0
图片压缩后,依然很大的解决方案
图片压缩后,依然很大的解决方案
117 0
|
存储 编解码 Android开发
一款压缩图片又不损画质的黑科技软件!!!
一款压缩图片又不损画质的黑科技软件!!!
|
存储 前端开发 算法
前端性能优化-图片
前端性能优化-图片
266 29
前端性能优化-图片
|
存储 缓存 前端开发
浅谈性能优化之图片压缩、加载和格式选择
目前市场上优化图片资源的方式有很多,如压缩图片、选择正确格式、 CDN 加速、懒加载等。
275 0
浅谈性能优化之图片压缩、加载和格式选择
|
机器学习/深度学习 人工智能 编解码
画质不变,体积却缩减 75%,谷歌这项图片压缩黑科技也是牛了!
去年年中的时候网络上曾流传一个消息称谷歌正在开发一种新技术,利用人工智能技术压塑图片,可以使图片在画质不变的情况下缩减文件体积,半年过去,这种技术已经研发成功。 日前,谷歌推出了一项名为-RASIR 的图像压缩技术,官方介绍表示,其能使图片画质保持不变的情况下将文件体积缩减 75%。
299 0
画质不变,体积却缩减 75%,谷歌这项图片压缩黑科技也是牛了!
|
API Android开发
【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
255 0