Android Bitmap压缩方式分析

在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成缩略图。
在Android开发中我们都会遇到在一个100*100的ImageView上显示一张过大的图片,如果直接把这张图片显示上去对我们应用没有一点好处反而存在OOM的危险,所以我们有必要采用一种有效压缩方式来显示上去。
private void calculateBitmapInSimpleSize() {
Bitmap _bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage);
getBitmapDatas(_bitmap);
BitmapFactory.Options optioins = new BitmapFactory.Options();
optioins.inJustDecodeBounds = true;
// optioins.inPreferredConfig = Bitmap.Config.RGB_565;//11158560
optioins.inPreferredConfig = Bitmap.Config.ARGB_8888;//22317120
BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
int reqWidth = optioins.outWidth;
int reqHeight = optioins.outHeight;
Log.w(TAG, "reqWidth = " + reqWidth);
Log.w(TAG, "reqHeight = " + reqHeight);
int inSampleSize = 1;
final int widthRatio = Math.round((float)reqWidth / 100f);
final int heigthRatio = Math.round((float) reqHeight / 100f);
// 取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度
inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;
Log.w(TAG, "first inSampleSize = " + inSampleSize);
final int totalPixel = 100 * 100;
final int totalReqPixel = reqWidth * reqHeight * 2;
Log.w(TAG, "totalReqPixel = " + totalReqPixel);
while (totalPixel / (inSampleSize * inSampleSize) > totalReqPixel) {
Log.w(TAG, "totalPixel = " + (totalPixel / (inSampleSize * inSampleSize)));
inSampleSize ++;
}
Log.w(TAG, "LastInSampleSize = " + inSampleSize);
optioins.inJustDecodeBounds = false;
Bitmap lastBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_homepage, optioins);
getBitmapDatas(lastBitmap);
mImageView.setImageBitmap(lastBitmap);
}
通过打印log我们可以清楚发现一张原始的图片占有22317120字节,经过压缩后11158560(RGB_565)/ 22317120(RGB8888)明显所占用的内存都减少了,尽量降低这种情况带来的OOM。
做法:
1.optioins.inJustDecodeBounds = true设置为true可用于读取该bitmap的宽高且不会占用内存。
2.optioins.inPreferredConfig = Bitmap.Config.RGB_565设置在内存中以占用最少的方式,相比RGB_8888只有其一半的内存占有。
3.final int widthRatio = Math.round((float)reqWidth / 100f);
final int heigthRatio = Math.round((float) reqHeight / 100f);
inSampleSize = widthRatio > heigthRatio ? heigthRatio : widthRatio;
计算压缩比例,取最小值 这将保证压缩出来的图片大于或者等于请求的宽度或者高度。
4.在要显示到ImageView的时候optioins.inJustDecodeBounds = false设回false这样就能正常显示了
// 计算bitmap所占内存值
public void getBitmapDatas(Bitmap bitmap) {
Log.w(TAG, "Bitmap size = " + bitmap.getByteCount());
}
采用以上的压缩方式 我们就能避免一张过大的图片”浪费”的显示在ImageView上造成内存消耗过大。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# Bitmap压缩方式
# bitmap图片压缩
# 详解android 通过uri获取bitmap图片并压缩
# Android实现图片压缩(bitmap的六种压缩方式)
# Android Bitmap压缩方法的选择详解
# android bitmap compress(图片压缩)代码
# 详解Android Bitmap的常用压缩方式
# 过大
# 就能
# 这将
# 最小值
# 可用于
# 都能
# 我们可以
# 这张
# 希望能
# 这种情况
# 有必要
# 谢谢大家
# 设置为
# 所占
# 两类
# 中以
# 就可以
# 正常显示
# 不改变
# 大致上
相关文章:
建站之星备案是否影响网站上线时间?
建站之星安装路径如何正确选择及配置?
太平洋网站制作公司,网络用语太平洋是什么意思?
上海网站制作开发公司,上海买房比较好的网站有哪些?
html制作网站的步骤有哪些,iapp如何添加网页?
如何生成腾讯云建站专用兑换码?
香港服务器选型指南:免备案配置与高效建站方案解析
如何在香港免费服务器上快速搭建网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
高防服务器如何保障网站安全无虞?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
建站主机助手选型指南:2025年热门推荐与高效部署技巧
宝塔建站教程:一键部署配置流程与SEO优化实战指南
网站企业制作流程,用什么语言做企业网站比较好?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何快速登录WAP自助建站平台?
名字制作网站免费,所有小说网站的名字?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
ppt制作免费网站有哪些,ppt模板免费下载网站?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
网站网页制作专业公司,怎样制作自己的网页?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
高防服务器租用如何选择配置与防御等级?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站之星收费标准详解:套餐费用及年费价格表一览
济南网站建设制作公司,室内设计网站一般都有哪些功能?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
如何通过WDCP绑定主域名及创建子域名站点?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
建站之星安装后界面空白如何解决?
学校建站服务器如何选型才能满足性能需求?
非常酷的网站设计制作软件,酷培ai教育官方网站?
建站三合一如何选?哪家性价比更高?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何快速上传建站程序避免常见错误?
网站制作公司排行榜,抖音怎样做个人官方网站
安云自助建站系统如何快速提升SEO排名?
常州企业网站制作公司,全国继续教育网怎么登录?
西安专业网站制作公司有哪些,陕西省建行官方网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何快速生成高效建站系统源代码?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何获取免费开源的自助建站系统源码?
c++ stringstream用法详解_c++字符串与数字转换利器
如何在七牛云存储上搭建网站并设置自定义域名?
linux top下的 minerd 木马清除方法
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
沈阳制作网站公司排名,沈阳装饰协会官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。