使用Thumbnails实现图片指定大小压缩
项目中有个要求,对上传服务器的图片大小进行判断,大于500k的图片要进行压缩处理,让其小于500k后在上传。
可以通过java api的ImageIO实现图片压缩,但是看了网上的博客普遍都说bug比较多,会有OOM内存溢出的现象。
Thumbnails插件是Google的插件,能指定不同的参数进行压缩操作。
比如:宽高(size),缩放(scale),制定质量比(outputQuality)等。
插件使用的jar包为:
thumbnailator-0.4.8.jar
代码如下:
/**
*
* @param srcPath 原图片地址
* @param desPath 目标图片地址
* @param desFileSize 指定图片大小,单位kb
* @param accuracy 精度,递归压缩的比率,建议小于0.9
* @return
*/
public static String commpressPicForScale(String srcPath,String desPath,
long desFileSize , double accuracy){
try {
File srcFile = new File(srcPath);
long srcFilesize = srcFile.length();
System.out.println("原图片:"+srcPath + ",大小:" + srcFilesize/1024 + "kb");
//递归压缩,直到目标文件大小小于desFileSize
commpressPicCycle(desPath, desFileSize, accuracy);
File desFile = new File(desPath);
System.out.println("目标图片:" + desPath + ",大小" + desFile.length()/1024 + "kb");
System.out.println("图片压缩完成!");
} catch (Exception e) {
e.printStackTrace();
}
return desPath;
}
public static void commpressPicCycle(String desPath , long desFileSize,
double accuracy) throws IOException{
File imgFile = new File(desPath);
long fileSize = imgFile.length();
//判断大小,如果小于500k,不压缩,如果大于等于500k,压缩
if(fileSize <= desFileSize * 500){
return;
}
//计算宽高
BufferedImage bim = ImageIO.read(imgFile);
int imgWidth = bim.getWidth();
int imgHeight = bim.getHeight();
int desWidth = new BigDecimal(imgWidth).multiply(
new BigDecimal(accuracy)).intValue();
int desHeight = new BigDecimal(imgHeight).multiply(
new BigDecimal(accuracy)).intValue();
Thumbnails.of(desPath).size(desWidth, desHeight).outputQuality(accuracy).toFile(desPath);
//如果不满足要求,递归直至满足小于1M的要求
commpressPicCycle(desPath, desFileSize, accuracy);
}
然后压缩图片大小:
commpressPicForScale(filePath, filePath, 500, 0.8);
压缩完成:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
cocos2d-2.0-x-2.0.3 交叉编译到android报错解决
我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也没成功 今天来了下载了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本问题还是哪一步出错误了,在这里详细的整理一下,感兴趣的朋友可以了解下2013-01-01
Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity(四)
这篇文章主要为大家详细介绍了Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-03-03
Android RecyclerView实现吸顶动态效果流程分析
RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法2022-12-12
Android自定义LinearLayout布局显示不完整的解决方法
这篇文章主要给大家介绍了关于Android自定义LinearLayout但布局显示不完整的解决方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-11-11
Android listview定位到上次显示的位置的实现方法
这篇文章主要介绍了Android listview定位到上次显示的位置的实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下2017-08-08


最新评论