使用Thumbnails实现图片指定大小压缩

 更新时间:2019年08月29日 08:37:20   作者:DcForever  
这篇文章主要为大家详细介绍了使用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);

压缩完成:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android 图片添加水印的实现方法

    Android 图片添加水印的实现方法

    这篇文章主要介绍了Android 图片添加水印的实现方法的相关资料,添加水印的原理就是在画布Canvas上绘制图形、图片、文字等等, 得到你想要的效果图片,需要的朋友可以参考下
    2017-07-07
  • cocos2d-2.0-x-2.0.3 交叉编译到android报错解决

    cocos2d-2.0-x-2.0.3 交叉编译到android报错解决

    我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也没成功 今天来了下载了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本问题还是哪一步出错误了,在这里详细的整理一下,感兴趣的朋友可以了解下
    2013-01-01
  • Android倒计时功能的实现代码

    Android倒计时功能的实现代码

    这篇文章主要介绍了Android倒计时功能的实现代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity(四)

    Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity(四)

    这篇文章主要为大家详细介绍了Android实现疯狂连连看游戏之加载界面图片和实现游戏Activity,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • android自定义控件实现简易时间轴(1)

    android自定义控件实现简易时间轴(1)

    这篇文章主要为大家详细介绍了android自定义控件实现简易时间轴,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Android RecyclerView实现吸顶动态效果流程分析

    Android RecyclerView实现吸顶动态效果流程分析

    RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法
    2022-12-12
  • Android自定义LinearLayout布局显示不完整的解决方法

    Android自定义LinearLayout布局显示不完整的解决方法

    这篇文章主要给大家介绍了关于Android自定义LinearLayout但布局显示不完整的解决方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Android listview定位到上次显示的位置的实现方法

    Android listview定位到上次显示的位置的实现方法

    这篇文章主要介绍了Android listview定位到上次显示的位置的实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • android绘制曲线和折线图的方法

    android绘制曲线和折线图的方法

    这篇文章主要介绍了android绘制曲线和折线图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 浅析Android手机卫士读取联系人

    浅析Android手机卫士读取联系人

    这篇文章主要介绍了浅析Android手机卫士读取联系人的相关内容,通过getContentResolver()方法获取获取ContentResolver内容解析器对象,对android手机卫士读取联系人相关知识感兴趣的朋友参考下吧
    2016-04-04

最新评论