package com.hzxc.groupactivity.server.util;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal; import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils; /**
* Created by hdwang on 2018/12/13.
*/
public class PicUtils { public static void main(String[] args) { PicUtils.commpressPicForScale("/Users/hdwang/Downloads/1.jpg","/Users/hdwang/Downloads/1_s.jpg", 1000, 0.8,750,1334); // 图片小于1000kb } /**
* 根据指定大小和指定精度压缩图片
*
* @param srcPath
* 源图片地址
* @param desPath
* 目标图片地址
* @param desFileSize
* 指定图片大小,单位kb
* @param accuracy
* 精度,递归压缩的比率,建议小于0.9
* @param desMaxWidth
* 目标最大宽度
* @param desMaxHeight
* 目标最大高度
* @return 目标文件路径
*/
public static String commpressPicForScale(String srcPath, String desPath,
long desFileSize, double accuracy,int desMaxWidth,int desMaxHeight) {
if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) {
return null;
}
if (!new File(srcPath).exists()) {
return null;
}
try {
File srcFile = new File(srcPath);
long srcFileSize = srcFile.length();
System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024
+ "kb");
//获取图片信息
BufferedImage bim = ImageIO.read(srcFile);
int srcWidth = bim.getWidth();
int srcHeight = bim.getHeight(); //先转换成jpg
Thumbnails.Builder builder = Thumbnails.of(srcFile).outputFormat("jpg"); // 指定大小(宽或高超出会才会被缩放)
if(srcWidth > desMaxWidth || srcHeight > desMaxHeight) {
builder.size(desMaxWidth, desMaxHeight);
}else{
//宽高均小,指定原大小
builder.size(srcWidth,srcHeight);
} // 写入到内存
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
builder.toOutputStream(baos); // 递归压缩,直到目标文件大小小于desFileSize
byte[] bytes = commpressPicCycle(baos.toByteArray(), desFileSize, accuracy); // 输出到文件
File desFile = new File(desPath);
FileOutputStream fos = new FileOutputStream(desFile);
fos.write(bytes);
       fos.close();  System.out.println("目标图片:" + desPath + ",大小" + desFile.length() / 1024 + "kb");
System.out.println("图片压缩完成!");
} catch (Exception e) {
e.printStackTrace();
return null;
}
return desPath;
} private static byte[] commpressPicCycle(byte[] bytes, long desFileSize, double accuracy) throws IOException {
// File srcFileJPG = new File(desPath);
long srcFileSizeJPG = bytes.length;
// 2、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩
if (srcFileSizeJPG <= desFileSize * 1024) {
return bytes;
}
// 计算宽高
BufferedImage bim = ImageIO.read(new ByteArrayInputStream(bytes));
int srcWdith = bim.getWidth();
int srcHeigth = bim.getHeight();
int desWidth = new BigDecimal(srcWdith).multiply(
new BigDecimal(accuracy)).intValue();
int desHeight = new BigDecimal(srcHeigth).multiply(
new BigDecimal(accuracy)).intValue(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //字节输出流(写入到内存)
Thumbnails.of(new ByteArrayInputStream(bytes)).size(desWidth, desHeight).outputQuality(accuracy).toOutputStream(baos);
return commpressPicCycle(baos.toByteArray(), desFileSize, accuracy);
} }

参考文章:

https://blog.csdn.net/qiaqia609/article/details/53171149

https://blog.csdn.net/u010355502/article/details/77197616

java图片压缩(Thumbnails)的更多相关文章

  1. Java图片压缩

    package com.test; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGIma ...

  2. Java 图片压缩

    package com.wuyu.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.Buff ...

  3. 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)

    安装过程(如图所示) .Exceptionin thread "main" java.lang.UnsatisfiedLinkError:C:\WINDOWS\system32\j ...

  4. java 图片压缩 缩放

    废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...

  5. Thumbnailator java图片压缩,加水印,批量生成缩略图

    地址:http://code.google.com/p/thumbnailator/ 1.指定大小进行缩放 //size(宽度, 高度) /* * 若图片横比200小,高比300小,不变 * 若图片横 ...

  6. Java图片处理 Thumbnails框架

    一.设置图片的缩放比例或者图片的质量比   第一步:导入maven的jar包 <dependency>     <groupId>net.coobird</groupId ...

  7. java,图片压缩,略缩图

    在网上找了两个图片的缩放类,在这里分享一下: package manager.util; import java.util.Calendar; import java.io.File; import ...

  8. java 图片压缩 剪切 水印 转换 黑白 缩放

    专注java已6年,欢迎加入java核心技术QQ群:135138817,每周五晚有群主进行技术讲座. import java.awt.AlphaComposite; import java.awt.C ...

  9. 纯Java代码 图片压缩

    Java图片压缩代码 package com.img; import java.awt.Image; import java.awt.image.BufferedImage; import java. ...

随机推荐

  1. Ef-Code-First 使用实体类映射出数据库

    最近面试时很多面试官都问到了EF框架 好记性不如烂笔头 赶紧记下来 code-first是EF框架中的一种,是使用实体类来进行数据库表的映射,所以实体类中的字段要规范(我认为) 比如: 如果有外键的话 ...

  2. unity2D 船只型物体驱动的实现

    船只向前行驶的驱动力 假设在水中没有摩擦阻力,船只有惯性,船只可以转弯,按下前进键时船只会在力的作用下使得自身的物理运动方向变化到自身的前方方向,从而向前行进. 上图中 V:船当前物理速度 V1,V2 ...

  3. jmeter 中 浮点数计算精度问题

    jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...

  4. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal&搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7429  Solved: 3098[Submit][St ...

  5. 伪装为 吃鸡账号获取器 的QQ木马分析

    本文作者:i春秋作家坏猫叔叔 0×01 起因随着吃鸡热潮的来临,各种各样的吃鸡辅助和账号交易也在互联网的灰色地带迅速繁殖滋生.其中有真有假,也不乏心怀鬼胎的“放马人”.吃过晚饭后在一个论坛看到了这样一 ...

  6. spring boot 中使用LUA脚本

    编写LUA脚本 该脚本功能:先检查redis中某个key的值是否与期望的值V1一致,如果一致则将其修改为新的值V2并返回true,否则返回false.其实就是CAS. local current = ...

  7. [ActionScript 3.0] 有必要记录一下:flash builder运用Animate CC 发布的swc的一个奇葩问题,亲测

    之前一直用flash cs6 发布swc 配合flash builder4.6开发,最近用Animate CC发布swc,却出现无法flash builder4.6 无法连接到调试器的问题, 经过反复 ...

  8. win10+Theano+GPU

    1. cuda + cudnn 首先还是要先安装GPU库,具体和caffe安装中一样. 2. Theano 为防止下载速度慢,配置清华镜像 conda config --add channels ht ...

  9. vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

    vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...

  10. 关于一点儿对仓储(Repository)的理解

    仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...