以下是测试了三种图片压缩方式,通过测试发现使用jdk的ImageIO压缩时间更短,使用Google的thumbnailator更简单,但是thumbnailator在GitHub上的源码已经停止维护了。

1、Google的thumbnailator

pom.xml中引入依赖

        <dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>

测试源码:

/**
* @Title: ThumbnailatorUtil
* @Package: com.test.image
* @Description: google Thumbnailator 测试
* @Author: monkjavaer
* @Data: 2019/2/22 14:07
* @Version: V1.0
*/
public class ThumbnailatorUtil { public static void main(String[] args) {
try {
long start = System.nanoTime();
compressPic();
long end = System.nanoTime();
System.out.println("压缩时间:"+(end-start)*0.000000001+"s");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* scale: 按比例
* outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。注意使用该方法时输出的图片格式必须为jpg
* @throws IOException
*/
public static void compressPic() throws IOException {
// Thumbnails.of("E:\\3.png")
Thumbnails.of("E:\\154.jpg")
.scale(1f)
.outputQuality(0.25f)
.toFile("E:\\1.jpg");
} }

  输出:压缩时间:0.5615769580000001s

2、Java原生ImageIO实现:

/**
* @Title: ImageIOUtil
* @Package: com.test.image
* @Description: ImageIO test
* @Author: monkjavaer
* @Data: 2019/2/22 16:37
* @Version: V1.0
*/
public class ImageIOUtil { public static void main(String[] args) throws IOException {
long start = System.nanoTime();
compressPic("E:\\154.jpg", "E:\\1.jpg", 0.25f);
long end = System.nanoTime();
System.out.println("压缩时间:" + (end - start) * 0.000000001 + "s");
} public static void compressPic(String srcFilePath, String descFilePath, Float quality) throws IOException {
File input = new File(srcFilePath);
BufferedImage image = ImageIO.read(input); // 指定写图片的方式为 jpg
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); // 先指定Output,才能调用writer.write方法
File output = new File(descFilePath);
OutputStream out = new FileOutputStream(output);
ImageOutputStream ios = ImageIO.createImageOutputStream(out);
writer.setOutput(ios); ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed()){
// 指定压缩方式为MODE_EXPLICIT
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// 压缩程度,参数qality是取值0~1范围内
param.setCompressionQuality(quality);
}
// 调用write方法,向输入流写图片
writer.write(null, new IIOImage(image, null, null), param); out.close();
ios.close();
writer.dispose();
}
}

  输出:压缩时间:0.44548557000000005s

3、com.sun.image.codec.jpeg.JPEGCodec实现

测试代码:

public class JPEGCodecUtil {

    public static void main(String[] args) throws IOException {
long start = System.nanoTime();
compressPic(new File("E:\\154.jpg"), new File("E:\\1.jpg"), 1920, 0.25f);
long end = System.nanoTime();
System.out.println("压缩时间:" + (end - start) * 0.000000001 + "s");
} /**
* 缩放图片(压缩图片质量,改变图片尺寸)
* 若原图宽度小于新宽度,则宽度不变!
* @param newWidth 新的宽度
* @param quality 图片质量参数 0.7f 相当于70%质量
* 2015年12月11日
*/
public static void compressPic(File originalFile, File resizedFile,
int newWidth, float quality) throws IOException { if (quality > 1) {
throw new IllegalArgumentException(
"Quality has to be between 0 and 1");
} ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
Image i = ii.getImage();
Image resizedImage = null; int iWidth = i.getWidth(null);
int iHeight = i.getHeight(null); if(iWidth < newWidth){
newWidth = iWidth;
}
if (iWidth > iHeight) {
resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight)
/ iWidth, Image.SCALE_SMOOTH);
} else {
resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight,
newWidth, Image.SCALE_SMOOTH);
} // This code ensures that all the pixels in the image are loaded.
Image temp = new ImageIcon(resizedImage).getImage(); // Create the buffered image.
BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),
temp.getHeight(null), BufferedImage.TYPE_INT_RGB); // Copy image to buffered image.
Graphics g = bufferedImage.createGraphics(); // Clear background and paint the image.
g.setColor(Color.white);
g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
g.drawImage(temp, 0, 0, null);
g.dispose(); // Soften.
float softenFactor = 0.05f;
float[] softenArray = { 0, softenFactor, 0, softenFactor,
1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
Kernel kernel = new Kernel(3, 3, softenArray);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
bufferedImage = cOp.filter(bufferedImage, null); // Write the jpeg to a file.
FileOutputStream out = new FileOutputStream(resizedFile); // Encodes image as a JPEG data stream
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder
.getDefaultJPEGEncodeParam(bufferedImage); param.setQuality(quality, true); encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
} // Example usage }

  输出:压缩时间:0.52596054s

java服务器图片压缩的几种方式及效率比较的更多相关文章

  1. Java中图片压缩处理

    原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...

  2. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  3. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

  4. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  5. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  6. java实现图片压缩

    java实现图片压缩 package Test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io. ...

  7. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  8. java 实现md5加密的三种方式与解密

      java 实现md5加密的三种方式 CreateTime--2018年5月31日15点04分 Author:Marydon 一.解密 说明:截止文章发布,Java没有实现解密,但是已有网站可以免费 ...

  9. Python:实现图片裁剪的两种方式——Pillow和OpenCV

    原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...

随机推荐

  1. JavaScript异常处理和事件处理

    异常捕获 1.异常:      当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行 2.异常抛出:      当异常产生,并且将这个异常生成一个错误信息 3.异常捕 ...

  2. poj3040 Allowance

    思路: 贪心. 看了题解说是 先把面值从大到小排序然后从头往尾扫,只要不超额,能取多少去多少然后如果还有剩余,就从尾往头扫,尽量取,让他恰好超额 不过并不懂证明. 实现: #include <i ...

  3. 公众号如何获取已关注用户的unionid的问题

    避免误导,先加一句:首先,得公众号绑定开放平台 这个问题困扰了我一早上,我尝试了很多次获取unionid都失败. 微信的开发文档上有说: 关于特殊场景下的静默授权 1.上面已经提到,对于以snsapi ...

  4. Node.js——路径问题

    相对路径问题:读取文件,形如 ./ 或者 ../  一般认为这个点是相对于这个 js 文件的文件夹路径,实际上不是,这个点相对于node命令时的当前路径,不同 js 文件下进行 ./  这样的引入是不 ...

  5. JPA createNativeQuery遇到的几个问题

    1.count方法返回值类型为java.math.BigInteger Query query = null; String sql = null; sql = "select count( ...

  6. H3C AR28-31路由器组网实验

    接线图 可以发现PC1和PC2不在一个网段上,如果不靠路由器就不可能ping,所以要用路由器组网 接线步骤 串行线连接路由器1与路由器2 以太网线连路由器以太网口 与 交换机接口 计算机网线连交换机口 ...

  7. java_StringBuffer、StringBuilder

    StringBuffer和StringBuider是可变的字符串,使用方法 相同,StringBuffer是线程安全的,StringBuider是线程不安全的 public class StringT ...

  8. 在vue中场景,循环行,点击当前行编辑数据

    当前列表 点击编辑,行变为编辑框. <Row style="color:#999;margin-bottom:11px"> <Row style="ma ...

  9. Codeforces Beta Round #1 补题题解

    A Theatre Square(数学) 算出每行能装多少乘以每列能装多少就行 公式 ans=ceil(n/a)+ceil(m/a) 代码 #include <bits/stdc++.h> ...

  10. python在linux下的使用

    1.查看python(解释器)的版本(什么版本的解释器支持哪一版版的语言标准) 一般在linux上已经预装了python,只要在Bash Shell中输入python,即可看到如下版本信息: 按Ctr ...