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. C# 动态创建SQL数据库(二)

    使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关系映射来创建数据库与表 一 新建项 ...

  2. 获取webpart方法以及连接字符串记录

    在页面地址后面添加?contents=1就可以显示所有页面的webpart部件了 server=wtcsps05;database=Testing_DB;uid=sqluser;password=wt ...

  3. MVC 5使用ViewBag(对象)显示数据

    前面Insus.NET有演示使用ViewData来实现控制器与视图的通讯.如果想了解的话,可以从下面两个链接可以查看:<MVC 5使用ViewData(对象)显示数据>http://www ...

  4. Java实时监控类库Metrics

    随着系统越来越大,越来越复杂,我们需要在业务方面加上一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使用Metrics 使用Metrics,只 ...

  5. W,b的初始化和几种激活函数

    权重W不能全部初始化为0,原因很简单,我们可以自己在本子上推导一下,假设现有一个含有一个隐藏层,隐藏层含有两个神经元初始输入为两个向量的网络,如果权重初始化全部为0,那么,第一层的输出,会和第二层的输 ...

  6. oracle undo redo 解析

    Undo是干嘛用的?          简单理解,就相当于Windows下的回收站.        你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果 ...

  7. python面试(3)

    一.语言 推荐一本看过最好的python书籍? 拉开话题好扯淡 谈谈python的装饰器,迭代器,yield? 标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗? pyth ...

  8. Ubuntu 16.04 服务器上配置使用 Docker

    Docker基础概念 在使用Docker之前,我们先了解下几个Docker的核心概念 Docker Daemon Docker引擎,就是运行在后台的一个守护进程,在我们启动它之后,我们就可以通过Doc ...

  9. zepto中的touch库与fastclick

    1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...

  10. linux-程序发布脚本

    写了个启动程序, 调优jvm的脚本 #!/bin/bash MEM=`free -m | grep Mem | awk '{print int($2 * 90 / 100)}'` JAVA_OPTS= ...