从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以java语言下的安卓开发过程中图片压缩问题。

图片加载在我们的开发过程中都是一个内存大户,以至于我们加载每一个图片bitmap对象的时候都应该进行回收以减少内存的占用,而如果单张图片的大小加载在内存都会造成oom内存溢出,那么只是单纯的回收就没办法解决了。我们就会涉及到图片压缩。我总结了几种图片压缩的方式和图片占内存的形式,供大家参考。 有人说一张图片也就几mb,而手机内存有1G-8G,为什么会内存溢出呢?这就要从图片占用内存的形式说起了。

图片是由像素点组成的,我们常见的分辨率1920乘1080,960乘720,2560乘1400等,其实就是指屏幕横向或者纵向有多少个像素点,正常手机上如果图片像素密度过大,占用的内存也就会相应的大。图片也是一样。以尺寸 800乘400为例,图片占用内存就是800乘400乘每个像素点占用的字节数。那么每个像素占用多少内存呢?这就涉及到图片像素的位图位数。一般情况下我们只需考虑这四种模式。

ALPHA_8就是Alpha由8位组成 ARGB_4444就是由4个4位组成即16位, ARGB_8888就是由4个8位组成即32位, RGB_565就是R为5位,G为6位,B为5位共16位。 不要问我ARGB-8888为什么是三十二位,因为四八三十二。 众所周知一个字节的存储单位能存储8位,所以以最占内存的ARGB-8888为 例这种模式下一个像素点会占用4个字节。也就是说,总占用内存数量为 800乘480乘4=1536000字节=1536kb=1.536mb。将ARGB-8888转换为RGB-565, 就可以降低一半的内存消耗,但是会损失透明度,在你不需要透明度的情 况下,就可以这样处理。这样不会损失清晰度。这就是第一种压缩方法。

第二种压缩方法也是比较常见的,bitmap的自适应压缩。也就是说,如果图片是8000乘4000,而手机屏幕控件需要的只有800乘400,那么我就需要将图片的长和宽压缩到原来的1/10,这样内存占用减少到原来的1/100,具体方法就是bitmap工厂创建bitmap对象的时候加上一个自己设置的options,并且options通过这个方法,

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height

/ (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }

去动态计算需要压缩的倍数,这样就可以在视野范围内对图片进行无损压缩,但是如果你要放大,就不行了。

第三种方法,这里放上一个链接,https://github.com/Curzibn/Luban

这是Curzibn大神写的一个,仿照微信的一个压缩图片的方法,实测可以将10m左右的图片压缩到1m以下,不放很大看看不出损失清晰度的,具体就是写了一个算法吧,大神的代码我就不多解释评价了。

第四种,也是我之前找到的一个专门用来压缩图片的框架,叫NativeImgCompress的一个强大的压缩图片框架,github上能下载,地址是https://github.com/lichao3140/NativeImgCompress1

打开jar包里面是ndk写的 jni方法调用C语言算法的东西,总之非常强大。 最近想给我和我老婆写一个结婚照的app记录一下我们的一生,就用的这个压缩方法压缩的图片,很强大,用法核心代码就这一行 NativeUtil.compressBitmap(File1, File2, 50);就可以把原路径的图片转存到新路径,你的10m图片就变成几百k了,当然50是可以调整的。

推荐采用第三种第四种,因为不仅可以减少内存的占用,也可以减少apk安装包的大小,瘦身还是开发者都需要的。 另外推荐一下一个原创帖子,apk瘦身图片资源优化处理 http://blog.csdn.net/chzphoenix/article/details/75227590

写了这么多希望对每个需要图片处理的童鞋有所帮助,收藏一波走起吧!

安卓关于图片压缩的那些事儿,希望给每个安卓开发人员一些帮助相关推荐

  1. Android Study 之聊聊关于图片压缩那点事儿

    LZ-Says: 小沈阳版程序员~~~ 程序员其实可痛苦的了--需求一做一改,一个月就过去了:嚎~ 需求再一改一调,一季度就过去了:嚎~ 程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了: ...

  2. cordova 安卓文件多选_安卓zip文件压缩RAR解压软件下载-安卓zip文件压缩RAR解压下载v3.0.4安卓版...

    安卓zip文件压缩RAR解压是一款非常好用的手机压缩解压缩神器,在安卓zip文件压缩RAR解压上我们可以看到很多的实用的功能,软件可以帮助我们更好的处理我们手机中的文件,感兴趣的朋友赶紧下载安卓zip ...

  3. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

  4. Netflix选择AVIF作为下一代图片压缩技术

    Photo by John-Mark Smith from Pexels Netflix在情人节当天公开AVIF作为下一代图片压缩技术,同其宣布在Android端采用AV1视频编解码格式仅相隔一周时间 ...

  5. Android性能优化之图片压缩优化

    1 分类 Android图片压缩结合多种压缩方式,常用的有尺寸压缩.质量压缩.采样率压缩以及通过JNI调用libjpeg库来进行压缩. 参考此方法:Android-BitherCompress 备注: ...

  6. 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )

    文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...

  7. Gulp 之图片压缩合并

    同事需要处理很多的图片,由于UI那边提供图片比较大,为了性能好一点,程序包小一点,因此希望我帮忙做成小程序来完成此工作. 其实之前做过一个grunt写的图片压缩合并工具,当时是为了处理270多个国家/ ...

  8. mozjpeg:JPEG图片压缩5%,获Facebook支持

    mozjpeg是一个来自Mozilla实验室的JPEG图像编码器项目,目标是在不降低图像质量且兼容主流的解码器的情况下,提供产品级的JPEG格式编码器来提高压缩率以减小JPEG文件的大小. Mozil ...

  9. glide 压缩图拍呢_用Glide-图片的压缩-图片压缩原理

    前言: 这一节里面我们将介绍Glide如何对图片进行压缩,这一点在加载图片较多或者加载的图片像素很高的程序里面至关重要 Glide 系列目录 1.Glide-入门教程 2.Glide-占位图以及加载动 ...

最新文章

  1. 【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
  2. 2014考研计算机网络,2014考研计算机专业大纲:计算机网络部分现两大变化
  3. 初探swift语言的学习笔记八(保留了许多OC的实现)
  4. mysql query 原理_[转]MySQL的Query Cache原理
  5. 标准C程序设计七---120
  6. vue的style绑定background-image url 写法
  7. 使用最小二乘法计算多元线性回归的公式推导
  8. 软件设计与体系结构实验——图书馆管理系统
  9. 详解三极管NPN与PNP区别
  10. kvm连接服务器显示不全有重影,KVM多电脑切换器常见故障排查及处理方法
  11. 全球及中国SxS(遥控潜水器)行业商业模式分析及投资风险预测2022年版
  12. Unity Timeline的使用
  13. java tls_Java客户端中具有SNI的TLS
  14. 50款可以替代桌面软件的在线服务
  15. 最新短网址生成api接口(t.cn、url.cn短链接生成)
  16. IntelliJ IDEA自动添加空行问题
  17. 【CAN】CAN总线要点
  18. onenote使用记录(1):新建与删除笔记本
  19. ImportError: cannot import name ‘SummaryWriter‘ from partially initialized module ‘torch.utils.tenso
  20. JavaEE项目实战(OA系统)之十八_流程审批之一

热门文章

  1. linux下tomcat6.0与jdk安装详细步骤
  2. python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码
  3. leetcode339. 嵌套列表权重和
  4. Git(6)-Git配置文件、底层操作命令
  5. C++(18)--复制构造函数
  6. ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件
  7. LeetCode - Easy - 169. Majority Element
  8. c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
  9. C++ 左值和右值 的学习
  10. Volatile原子性一致性JVM指令重排