android 将图片压缩到指定的大小的示例
作者:peirato_ 发布时间:2021-07-29 23:09:23
标签:android,压缩,图片
从网上收集后自己写的一个方法;
1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩
/**
* 根据分辨率压缩图片比例
*
* @param imgPath
* @param w
* @param h
* @return
*/
private static Bitmap compressByResolution(String imgPath, int w, int h) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imgPath, opts);
int width = opts.outWidth;
int height = opts.outHeight;
int widthScale = width / w;
int heightScale = height / h;
int scale;
if (widthScale < heightScale) { //保留压缩比例小的
scale = widthScale;
} else {
scale = heightScale;
}
if (scale < 1) {
scale = 1;
}
Log.i(TAG,"图片分辨率压缩比例:" + scale);
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imgPath, opts);
return bitmap;
}
2.第二就是循环对图片的压缩,直到压缩到指定的大小以下为止(重要!)
/**
* 根据分辨率压缩
*
* @param srcPath 图片路径
* @param ImageSize 图片大小 单位kb
* @return
*/
public static boolean compressBitmap(String srcPath, int ImageSize, String savePath) {
int subtract;
Log.i(TAG, "图片处理开始..");
Bitmap bitmap = compressByResolution(srcPath, 1024, 720); //分辨率压缩
if (bitmap == null) {
Log.i(TAG, "bitmap 为空");
return false;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
Log.i(TAG, "图片分辨率压缩后:" + baos.toByteArray().length / 1024 + "KB");
while (baos.toByteArray().length > ImageSize * 1024) { //循环判断如果压缩后图片是否大于ImageSize kb,大于继续压缩
subtract = setSubstractSize(baos.toByteArray().length / 1024);
baos.reset();//重置baos即清空baos
options -= subtract;//每次都减少10
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
Log.i(TAG, "图片压缩后:" + baos.toByteArray().length / 1024 + "KB");
}
Log.i(TAG, "图片处理完成!" + baos.toByteArray().length / 1024 + "KB");
try {
FileOutputStream fos = new FileOutputStream(new File(savePath));//将压缩后的图片保存的本地上指定路径中
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
if (bitmap != null) {
bitmap.recycle();
}
return true; //压缩成功返回ture
}
在这其中
/**
* 根据图片的大小设置压缩的比例,提高速度
*
* @param imageMB
* @return
*/
private static int setSubstractSize(int imageMB) {
if (imageMB > 1000) {
return 60;
} else if (imageMB > 750) {
return 40;
} else if (imageMB > 500) {
return 20;
} else {
return 10;
}
}
这个方法用来动态设置每次压缩的比例,主要用于提升压缩的时间,这其中的数值是我大概测试出来的可以修改成你认为比较合适的
3.最后
压缩图片费时又费内存,很明显执行的时候需要在子线程中完成,如果需要的话可以加一个压缩完成的监听
下载地址:CommonUtils_jb51.rar
来源:http://blog.csdn.net/peirato_/article/details/55213545
0
投稿
猜你喜欢
- 一、简介Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。官方的解释比较乏味,通俗的说就是创建一个子线程,给它加了这
- 这篇会深化View拖拽实例,利用Flutter Animation、插值器以及AnimatedBuilder教大家实现带动画的抽屉效果。先来
- @Value注解设置默认值在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值
- 为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平。你的一个决定会影响团队未来的几年。要考虑方面太多:
- C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的。var
- 补间可以实现两个图形之间颜色、形状、大小、位置等的线性变化。例如A...AB...BC...C,其中A、B、C是三幅图片,两个A的宽分别是1
- 一、前言在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中
- @RequestBody不能class类型匹配在首次第一次尝试使用@RequestBody注解开始加载字符串使用post提交(貌似只能pos
- c#开发cad如何预览图块1.定义变量的方法代码如下2. 获取GetDwgImag图像的方法代码3.实现显示DWG文件的方法代码方
- 本文实例讲述了java编程实现根据EXCEL列名求其索引的方法。分享给大家供大家参考,具体如下:原理:[a1-z26]*26^n-1 + [
- 在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进
- 一、概述我们对于这个图片肯定会非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构。在数据结构中我们了解到可以
- Mybatis批量插入index out of range错误往往我们看到网上关于各类关于批量插入报这种错误的文章都是传入的集合为null,
- 我就废话不多说了,大家还是直接看代码吧~<select id="getBiTree" parameterType=
- Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开
- <?xml version="1.0" encoding="utf-8"?><Ed
- Java 1.0 IO系统介绍1 Java IO版本Java库的IO分为输入/输出两部分。早期的Java 1.0版本的输入系统是InputS
- 本文以实例形式简单讲述了引用类型转换的几种常见方式,如:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换。现分述如下,供大家参
- 在C#中,当引用类型需要转换的时候,经常会用到关键字is、as以及显式强转。本篇来体验这三者的用法。先来梳理.NET引用类型转换的"
- 1.更新同步方式:/** * 三个参数 * the path of the node