本文介绍了 Bitmap 压缩的四种方式,相关代码可见:Githhub-GdTestHub

文章目录

  • 一、质量压缩
  • 二、采样率
  • 三、缩放法
  • 四、RGB_565

Android 中图片是以 bitmap 形式存在的,那么 bitmap 所占内存,直接影响到了应用所占内存大小,首先要知道 bitmap 所占内存大小计算方式:

像素数 x 像素大小
=
图片长度(单位为像素) x 图片宽度(单位为像素) x 一个像素点占用的字节数

可采用的压缩方法:

  1. 质量压缩:内存不变,压缩转化后的 bytes.length 减少,适用于传输,png 无效
  2. 采样率压缩(Options):改变宽高,减少像素,采用一定的采样算法
  3. 缩放法压缩(Matrix):改变宽高,减少像素,采用一定的缩放算法(数字图像处理相关)
  4. RGB_565:改变字节数

一、质量压缩

样板代码:

val baos = ByteArrayOutputStream()
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
bmRaw.compress(Bitmap.CompressFormat.JPEG, 50, baos)
val bais = ByteArrayInputStream(baos.toByteArray())
val bmScaled = BitmapFactory.decodeStream(bais, null, null)

说明:

使用 JPEG 格式的质量压缩

bmRaw.compress(Bitmap.CompressFormat.JPEG, 50, baos)
  • 对一张透明图片(png),内存、宽高不变,bytes.length 减少。图片会失去透明度,透明处变黑,
  • 对一张非透明图片(png、jpg),内存、宽高不变,bytes.length 减少。

使用 PNG 格式的质量压缩

bmRaw.compress(Bitmap.CompressFormat.PNG, 50, baos)
  • 对一张透明图片(png),没有影响
  • 对一张非透明图片(png、jpg),没有影响

二、采样率

样板代码:

val options = BitmapFactory.Options()
options.inSampleSize = 2
val bmScaled = BitmapFactory.decodeResource(resources, drawableId, options)
// decode 的方法:
BitmapFactory.decodeFile()
BitmapFactory.decodeRecourse()
BitmapFactory.decodeStream()
BitmapFactory.decodeByteArray()

说明:

The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap.
样本大小是在解码位图中对应于单个像素的任一维度上的像素个数。

也就是说,如果 inSampleSize = 2,采样后的一个像素在 x 轴上相当于之前的 2 个像素,在 y 轴上也相当于之前的 2 个像素。
即采样后的一个像素相当于之前的 2*2=4 个像素。

三、缩放法

样板代码:

val bmRaw = BitmapFactory.decodeResource(resources, drawableId, null)
val matrix = Matrix()
matrix.setScale(0.5f, 0.5f)
val bmScaled = Bitmap.createBitmap(bmRaw, 0, 0, bmRaw.width, bmRaw.height, matrix, true)

说明:
与采样率法类似。

四、RGB_565

样板代码:

val options = BitmapFactory.Options()
options.inPreferredConfig = Bitmap.Config.RGB_565
val bmNew = BitmapFactory.decodeResource(resources, drawableId, options)

说明:
ALPHA_8 代表8位Alpha位图,一个像素1个字节
ARGB_4444 代表16位ARGB位图,一个像素2个字节
ARGB_8888 代表32位ARGB位图,一个像素4个字节
RGB_565 代表16位RGB位图,一个像素2个字节

如果inPreferredConfig不为null,解码器会尝试使用此参数指定的颜色模式来对图片进行解码,如果inPreferredConfig为null或者在解码时无法满足此参数指定的颜色模式,解码器会自动根据原始图片的特征以及当前设备的屏幕位深,选取合适的颜色模式来解码,例如,如果图片中包含透明度,那么对该图片解码时使用的配置就需要支持透明度,默认会使用ARGB_8888来解码。

所以直接设置 RGB_565:

  • 对于一张透明图片(png),内存、宽高不变,bitmap 也不会失去透明度。
  • 对于一张非透明图片(png、jpg),宽高不变,内存减小。

copy 一遍可以减少内存,但生成的 bitmap 会失去透明度,透明处变黑。

val bmScaled = bmRaw.copy(Bitmap.Config.RGB_565, true)

Bitmap 的四种压缩方式详解相关推荐

  1. Mybatis的四种分页方式详解

    LIMIT关键字 mapper代码 <select id="selectByPageInfo" resultMap="BaseResult">sel ...

  2. 自平衡二叉树(AVL)及四种旋转方式详解

    推荐可视化插入.删除节点的二叉树网站:AVL Tree Visualzation (usfca.edu) 1. 概述 AVL树是一种自平衡二叉搜索树,他是搜索二叉树(BST)的优化,它在每次插入或删除 ...

  3. 几种贴图压缩方式详解

    文章大部分摘自:http://kirenenko-tw.blogspot.com/2013/06/opengltexture-compression.html 一.前言 游戏场景里,贴图是影响真实性的 ...

  4. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  5. 文件服务器文件多备份方案,FileYee数据备份四种备份方案详解

    原标题:FileYee数据备份四种备份方案详解 其实有很多用户对FileYee数据备份软件不是特别熟悉,今天小编带大家了解一下FileYee的四种备份方案,一定会让大家对于数据备份有一个新的了解. 之 ...

  6. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  7. @Resource,@Autowired,@Inject3种注入方式详解

    转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...

  8. mvc ajax提交html标签,Mvc提交表单的四种方法全程详解

    Mvc提交表单的四种方法全程详解 2019-01-05 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了Mvc提交表单的四种方法全程详解,编程之家小编觉得挺不错的 ...

  9. 四种形态图解_中纪委”四种形态“指标体系详解

    中纪委"四种形态"指标体系详解 中纪委自提出"四种形态"以来,官方.民间一直对"四种 形态"各包含什么内容, 在具体实践中如何应用, 存在较 ...

最新文章

  1. linux tempfs及/dev/shm 基于内存的文件系统
  2. 【转】快捷支付详解--比较详细
  3. jQuery的顶级对象 $
  4. jQuery动画的显示与隐藏效果!
  5. JavaScript实现向OL列表内动态添加LI元素的方法
  6. MyBatis框架学习笔记03:利用MyBatis实现关联查询
  7. 构建面向对象的应用软件系统框架
  8. 图像处理保研面试_细思极妙的保研面试经验汇总?这些小技巧太加分了吧
  9. java手动调用finalize_Java并手动执行finalize
  10. Loadrunner乱码的解决办法
  11. vue4 库模式打包_Steam“小模式”游戏库回归 界面轻快简洁可随时切换
  12. 翻译: 如何使用 Xcode 的内存图调试器检测 iOS 内存泄漏并保留周期
  13. 平面直角坐标系中的旋转公式_巧用隐圆求解旋转中的最值问题
  14. 开发者从应用程序商店难以赚到真金白银
  15. 联想数据中心技术总监单奖定:双态IT -数字化转型下的IT建设新思路
  16. 详解数据库三大范式、BCNF范式
  17. 微信小程序使用三元运算符
  18. 华为设备DNS配置命令
  19. 程序员自我欺骗的9个谎言
  20. Serialize的使用

热门文章

  1. 构建表情符号制作应用程序
  2. 软件测试工程师基础类面试题及参考答案
  3. java制作海报工具类,java操作图片贴图,java给图片添加文字,调整字体颜色大小间距
  4. JS高级 之 深入浏览器的渲染原理
  5. cos66度等于多少度 用计算机怎么算,三角函数值表(三角函数计算方法及快速查询表)...
  6. 马云向约旦王后基金会捐助300万美元,帮助阿拉伯难民儿童获得教育机会
  7. Spark的RDD的弹性体现在什么地方?------面试题
  8. showModalDialog打开窗口时不跳入新页面设置
  9. mac下免费的动态截屏制图工具:kap
  10. html只显示一句话_您所说的话:如何最大化多显示器设置