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

从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行it现状调研_中央银行系统行业现状调研分析及发展趋势预测报告(2019年版)...

QYResearch预测&#xff1a;2019-2025全球与中国中央银行系统市场现状及未来发展趋势【纸版价格】&#xff1a;RMB 15000【电子版(PDF)价格】&#xff1a;RMB 15000【报告篇幅】&#xff1a;112【报告图表数】&#xff1a;158【报告出版时间】&#xff1a;2019年11月报告摘要本…

视频编解码技术小结

1、什么是H.261编码协议 答&#xff1a;H.261是最早出现的视频编码建议&#xff0c;它采用的算法结合了可减少时间冗余的帧间预测和可减少空间冗余的DCT变换的混合编码方法&#xff0c;其输出码率是p64kbit/s。p取值较小时&#xff0c;只能传清晰度不太高的图像&#…

fiber报错 (type *big.Int has no field or method FillBytes)

如何绕过dgrijalva/jwt go中的cve-2020-26160漏洞 go jwt jwt-go由于存在一个高级漏洞&#xff0c;Gitlab管道中无法传递容器安全状态。此漏洞为jwt-go&#xff0c;安装的版本为v3.2.0incompatible。错误标题如下&#xff1a;jwt-go: access restriction bypass vulnerability…

基于BISS0001构成的热释电红外延时照明控制器电路图

BISS0001是采用CMOS数模混合结构、具有DIP-16和SOIC-16两种封装的热释电红外传感信号处理集成电路。芯片内部集成了电压比较器、状态控制器、延时电路定时器、封锁时间定时器以及参考电压源等电路&#xff0c;常用于防盗报警器、自动门等各种自动开关。利用BISS0001构成的热释电…

安卓APP破解利器之FRIDA

本文讲的是安卓APP破解利器之FRIDA&#xff0c;在我去年参加RadareCon大会的时候&#xff0c;我了解到了一个动态的二进制插桩框架——Frida。起初我觉得它似乎只有一丁点趣味&#xff0c;后来经过实践才发现它原来是如此的有趣。记得游戏里的上帝模式吗&#xff1f;这就是Frid…

如何获取option的下标和值_数智化时代下,如何获取企业增长密码?

信息化时代下&#xff0c;很多企业前前后后上线了各种信息化系统&#xff0c;ERP、OA、CRM…随着企业数字化的深入推进&#xff0c;“移动互联网、云计算、大数据、人工智能、物联网、区块链”等技术的革新&#xff0c;这些信息化系统难以满足企业对数智化转型的新需求&#xf…

解决Gorm中使用Count后关联查询失效的问题

解决Gorm中使用Count后关联查询失效的问题 问题描述 当我们 在go中使用gorm进行多表join关联查询的时候 如果还有分页的需求 那么可能会是这样写 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"ormLogger "gorm.io/gorm/logger"…

hdu1540/poj2892 线段数区间合并

HDU - 1540 POJ - 2892 题意&#xff1a;n个点&#xff0c;有3种操作D a表示摧毁a这个点&#xff0c;R 表示修复上一个点&#xff0c;Q x表示查询x所在的区间没被摧毁的连续最大区间 思路&#xff1a;线段树区间合并&#xff0c;区间合并主要就是对lsum rsum 和sum的动态维护&…

基于51单片机的交通灯控制设计

课程设计任务书及成绩 课程名称 单片机课程设计 题目 交通灯控制设计 课程设计目标与任务、计划与进度安排: 实践教学要求与任务: 1、了解交通灯的基本工作原理&#xff1b; 2、用Proteus模拟实现交通灯控制&#xff1b; 3、用Keil C51编程实现上述功能&#xff1b; 4、…

福斯i6飞行模式设置_数据网络卡的时候,不妨试试“开关飞行模式”?上网速度明显变快...

相信大家都有过这种经历&#xff0c;手机数据网速很慢的时候&#xff0c;开一下飞行模式再关闭&#xff0c;上网速度会比之前快很多&#xff0c;这就有人有了疑问&#xff0c;为什么呢&#xff1f;开飞行模式再关掉飞行模式&#xff0c;其实等于是完成了一次手动的小区重选。移…

安装开源 ITIL 门户 iTOP

在 CentOS 7 上部署iTOP是一个简单的基于Web的开源IT服务管理工具。它有所有的ITIL功能&#xff0c;包括服务台、配置管理、事件管理、问题管理、变更管理和服务管理。iTOP依赖于Apache/IIS、MySQL和PHP&#xff0c;因此它可以运行在任何支持这些软件的操作系统中。因为iTOP是一…

基于FPGA 的8b10b编解码电路前端电路设计

基于FPGA 的8b10b编解码电路前端电路设计 摘 要 本设计是采用EDA技术设计的一种8B /10B 编解码电路,实现了在高速的串行数据传输中的直流平衡。该编解码电路设计大体上可以由五个模块构成&#xff0c;分别是默认编码模块、差异度计算模块、编码校正模块、并串转换模块、显示模…

day15(mysql 的多表查询,事务)

mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起&#xff01; /*创建表t1*/ CREATE TABLE t1(a INT PRIMARY KEY ,b VARCHAR(10) ) INSERT INTO t1 VALUES(1,a); INSERT INTO t1 VALUES(2,b); INSERT INTO t1 VALUES(3,c); /*创建t2*/…

vue router传参_新手使用vue-router传参时注意事项

1. 使用name和params组合传参this.$router.push({name: details, params: {id: 233}})路由配置import Vue from vueimport Router from vue-router Vue.use(Router) export default new Router({ mode: history, routes: [ { path: /details, name: details, component: resolv…

FFMpeg分析详细分析

与其说是分析&#xff0c;不如说是学习&#xff0c;只是看在自己第一次写系列文章的份上&#xff0c;给足自己面子&#xff0c;取个有"深度"的题目&#xff01;如有人被题目所蒙骗进来&#xff0c;还望见谅&#xff01; URLProtocol,URLContext和ByteIOContext是FFMp…

《jQuery基础》总结

目前&#xff0c;互联网上最好的jQuery入门教材&#xff0c;是Rebecca Murphey写的《jQuery基础》&#xff08;jQuery Fundamentals&#xff09;。这本书虽然是入门教材&#xff0c;但也足足有100多页。我对它做了一个详细的笔记&#xff0c;试图理清jQuery的设计思想&#xff…

逻辑综合工具DesignCompiler使用教程

逻辑综合工具Design Compiler使用教程 图形界面design vision操作示例 逻辑综合主要是将HDL语言描述的电路转换为工艺库器件构成的网表的过程。综合工具目前比较主流的是synopsys公司Design Compiler&#xff0c;我们在设计实践过程中采用这一工具。Design compiler有两种工作…

遍历结构体_三菱ST语言编程(3)——结构体变量

上篇文章介绍了数组&#xff0c;是一组相同类型数据的列表&#xff0c;那么不同类型的数据能否组合到一起用一个标签表示呢&#xff1f;答案当然是可以的&#xff0c;而实现这个功能的就是结构体(struct)。建立结构体在三菱结构化编程的界面中左侧程序部件里可以找到结构体标签…

关于微信小程序swiper的问题

关于小程序swiper的问题 代码 在官方示例上给swiper添加了currentbindchangecircular添加了一个buttonbindtap用于切换下一张 index.wxml <swiper indicator-dots"{{indicatorDots}}"bindchange"swiperChange"current"{{index}}"circular&quo…

PyQt5案例汇总(完整版)

个人博客点这里 PyQt5案例汇总(完整版) 起步 PyQt5是一套绑定Qt5的应用程序框架。他在Python 2.x和3.x中都是可用的。该教程使用的是Python3.x。 Qt库是一套最有用的GUI库。 PyQt5是作为一套Python模块实现的。他已经超过620个类和6000个函数与方法。他是一个运行在所有主…