三种Android图片压缩方法 压缩到指定大小
一、图片质量压缩
/*** 质量压缩方法* @param image* @return*/
public static Bitmap compressImage(Bitmap image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中int options = 90;while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩baos.reset(); // 重置baos即清空baosimage.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中options -= 10;// 每次都减少10}ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片return bitmap;
}
二、按比例大小压缩 (路径获取图片)
/*** 图片按比例大小压缩方法 * @param srcPath (根据路径获取图片并压缩) * @return*/
public static Bitmap getimage(String srcPath) {BitmapFactory.Options newOpts = new BitmapFactory.Options();// 开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空 newOpts.inJustDecodeBounds = false;int w = newOpts.outWidth;int h = newOpts.outHeight;// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;// 这里设置高度为800f float ww = 480f;// 这里设置宽度为480f // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww);} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放 be = (int) (newOpts.outHeight / hh);}if (be <= 0)be = 1;newOpts.inSampleSize = be;// 设置缩放比例 // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 bitmap = BitmapFactory.decodeFile(srcPath, newOpts);return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
}
三、按比例大小压缩 (Bitmap)
/*** 图片按比例大小压缩方法 * @param image (根据Bitmap图片压缩) * @return*/
public static Bitmap compressScale(Bitmap image) {ByteArrayOutputStream baos = new ByteArrayOutputStream();image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 if (baos.toByteArray().length / 1024 > 1024) {baos.reset();// 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中 }ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());BitmapFactory.Options newOpts = new BitmapFactory.Options();// 开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true;Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);newOpts.inJustDecodeBounds = false;int w = newOpts.outWidth;int h = newOpts.outHeight;Log.i(TAG, w + "---------------" + h);// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 // float hh = 800f;// 这里设置高度为800f // float ww = 480f;// 这里设置宽度为480f float hh = 512f;float ww = 512f;// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww);} else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放 be = (int) (newOpts.outHeight / hh);}if (be <= 0)be = 1;newOpts.inSampleSize = be; // 设置缩放比例 // newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565 // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 isBm = new ByteArrayInputStream(baos.toByteArray());bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩 //return bitmap;
}
三种Android图片压缩方法 压缩到指定大小相关推荐
- android图片传输三方框架,Android开发三种第三方图片加载的框架
最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...
- 图片上传压缩android,android 图片上传压缩常见问题分析
图片的上传与压缩是android经常需要用到的步骤,那么,如何解决上传图片oom问题呢?android 图片上传压缩常见问题分析,希望可以帮助大家更加的了解android 图片方面的困惑. 下面,是我 ...
- Android:三种Adapter的使用方法
三种Adapter的使用方法 1.simpleAdapter使用(3步:准备样式,准备数据,配置适配器) 1).adapter方法说明 2).插入一个listview ,创建 listview 样式x ...
- css 背景效果_css透明度怎么设置?三种css图片透明度的设置方法
css透明度的设置在网页的设计中是经常需要用到的,有时为了设计出的网页更加的美观,会对图片进行透明化处理,这样网页上面的内容就不会看不见,有的网页因为图片作为背景,也会更加美观,那么,css中的透明度 ...
- tomcat中三种部署项目的方法(转)
tomcat中三种部署项目的方法 第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加: <Context path="/h ...
- xslt三种带图片的超链接(a标签,img标签)写法
来源:http://www.notsee.info/tech/XSLT/XSLT-detail-333.xml 第一种带图片的超链接写法 xml <notsee ID="a002& ...
- 计算机win7开机了进入不到桌面,win7开机不显示桌面怎么回事|win7开机不显示桌面三种原因和解决方法...
一些win7系统用户在开机的时候发现电脑桌面不显示了,这样就没办法进行任何操作了,导致win7开机不显示桌面的原因有很多,为帮助大家能够快速解决问题,小编收集总结一些win7开机不显示桌面三种原因和解 ...
- 三种权重的初始化方法
总结了三种权重的初始化方法,前两种比较常见,后一种是最新的. 1. Gaussian Weights are randomly drawn from Gaussian distributions wi ...
- day01 js三种导入html的方法、js书写规范、变量的基本使用、变量提升
昨天是初学js的第一天,为什么今天才写,我觉得这样可以帮助我复习昨天的知识,加深对js的理解. 我之前学过java的,昨天转入js的学习,对js略有些体会和大家分享下,js刚入门感觉js相对于java ...
最新文章
- Visual Studio 2015编译Lua 5.3.4遇到的坑
- 2010有道难题练习赛2
- PostgreSQL 最佳实践 - 水平分库(基于plproxy)
- 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim
- String类得常用方法
- java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)
- HTML+CSS+JS实现 ❤️制作loading动画效果❤️
- LVIS挑战赛冠军总结 | 视觉任务中长尾分布问题研究进展与挑战
- 【报告分享】人工智能新时代报告.pdf(附下载链接)
- 数据结构 3-1-1 栈
- 2017 ACM-ICPC北京网络赛: C. Matrix(DP)
- gcc/g++ 编译、链接与常用命令工具(1)
- 在MFC中使用GDI+的一般方法,以VC6.0编译器为例
- 需求不容易确定的项目不要接
- ipixsoft swf to html5 converter,iPixSoft SWF to Video Converter
- 19年6月英语六级第一套听力单词
- 【Bootstrap】选择折叠项collapse
- 【vue】bable的介绍以及编写vue文件
- 【POJ】2676-Sudoku 【51Nod】1211-数独(DFS)
- 台式计算机文件打不开怎么回事,电脑文件打不开是怎么回事 电脑Word文档打不开怎么处理...