java使用google开源工具实现图片压缩【转】

时间:2022-11-14 10:15:52

jar包名

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

前言

作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情。

现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也是相当的高,当然占用的存储空间也就大了。问题也就产生了,你每个用户都上传个3M的图片怎么办?

但是显然现在硬盘的存放空间是不值钱的,1T、2T随便来,存放是能用钱解决的问题。

但是网速太值钱了,用户如果天天加载你的网页加载个半天,就是因为图片太大导致的那就不是钱能解决的问题了。

因为用户的网络环境你是不可控制的。所以你只能考虑压缩图片的质量从而保证网站打开的速度。

压缩的要求

图片压缩,在我的想法里面有下面几个要求。

1、压缩程度可控制,想压缩成多小就多小。

2、压缩之后图片尽可能的不失真。

3、压缩速度要快。

4、代码简单,依赖较少。

实现

然后带着这些要求去寻找,找到了Thumbnailator,一个google使用的开源的工具类。

这个工具类满足了上面所说的所有的要求。

同时对于图片的处理还有了别的方法,如旋转,裁切,加水印等等。

在github上面的地址是:https://github.com/coobird/thumbnailator

maven的地址

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

使用起来特别的简单:一行代码就搞定了

Thumbnails.of("原图文件的路径") 
        .scale(1f) 
        .outputQuality(0.5f) 
        .toFile("压缩后文件的路径");

其中的scale是可以指定图片的大小,值在0到1之间,1f就是原图大小,0.5就是原图的一半大小,这里的大小是指图片的长宽。

而outputQuality是图片的质量,值也是在0到1,越接近于1质量越好,越接近于0质量越差。

对于压缩图片来说上面就已经足够了。

PS:经过使用后的反馈,这个工具无法正确压缩出png格式的图片

因为png本身就是一种无损的图片格式,而jpg是一种压缩的图片格式;
当前方法目的是为了在尽可能不丢失图片质量的情况下进行的压缩;
建议将图片压缩后的格式设置成jpg来解决;.outputFormat("jpg")
工具源码本身最后还是调用jdk中的ImageIO.createImageOutputStream(fos);来实现的

优点

1、简单容易使用。

2、压缩图片效果很好。如下:其中100是原图,50就是0.5f

java使用google开源工具实现图片压缩【转】

3、图片质量不错下面是0.25f和原图的对比

java使用google开源工具实现图片压缩【转】

java使用google开源工具实现图片压缩【转】

上面是压缩过后的,下面是原图、看出来了吗?

其他功能

最后附上其他功能使用的简单例子

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions; public class ThumbnailatorTest { /**
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ThumbnailatorTest thumbnailatorTest = new ThumbnailatorTest();
thumbnailatorTest.test1();
thumbnailatorTest.test2();
thumbnailatorTest.test3();
thumbnailatorTest.test4();
thumbnailatorTest.test5();
thumbnailatorTest.test6();
thumbnailatorTest.test7();
thumbnailatorTest.test8();
thumbnailatorTest.test9();
} /**
* 指定大小进行缩放
*
* @throws IOException
*/
private void test1() throws IOException {
/*
* size(width,height) 若图片横比200小,高比300小,不变
* 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变
* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
*/
Thumbnails.of("images/test.jpg").size(200, 300).toFile("C:/image_200x300.jpg");
Thumbnails.of("images/test.jpg").size(2560, 2048).toFile("C:/image_2560x2048.jpg");
} /**
* 按照比例进行缩放
*
* @throws IOException
*/
private void test2() throws IOException {
/**
* scale(比例)
*/
Thumbnails.of("images/test.jpg").scale(0.25f).toFile("C:/image_25%.jpg");
Thumbnails.of("images/test.jpg").scale(1.10f).toFile("C:/image_110%.jpg");
} /**
* 不按照比例,指定大小进行缩放
*
* @throws IOException
*/
private void test3() throws IOException {
/**
* keepAspectRatio(false) 默认是按照比例缩放的
*/
Thumbnails.of("images/test.jpg").size(120, 120).keepAspectRatio(false).toFile("C:/image_120x120.jpg");
} /**
* 旋转
*
* @throws IOException
*/
private void test4() throws IOException {
/**
* rotate(角度),正数:顺时针 负数:逆时针
*/
Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("C:/image+90.jpg");
Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("C:/iamge-90.jpg");
} /**
* 水印
*
* @throws IOException
*/
private void test5() throws IOException {
/**
* watermark(位置,水印图,透明度)
*/
Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f)
.outputQuality(0.8f).toFile("C:/image_watermark_bottom_right.jpg");
Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f)
.outputQuality(0.8f).toFile("C:/image_watermark_center.jpg");
} /**
* 裁剪
*
* @throws IOException
*/
private void test6() throws IOException {
/**
* 图片中心400*400的区域
*/
Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false)
.toFile("C:/image_region_center.jpg");
/**
* 图片右下400*400的区域
*/
Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false)
.toFile("C:/image_region_bootom_right.jpg");
/**
* 指定坐标
*/
Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_coord.jpg");
} /**
* 转化图像格式
*
* @throws IOException
*/
private void test7() throws IOException {
/**
* outputFormat(图像格式)
*/
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");
} /**
* 输出到OutputStream
*
* @throws IOException
*/
private void test8() throws IOException {
/**
* toOutputStream(流对象)
*/
OutputStream os = new FileOutputStream("C:/image_1280x1024_OutputStream.png");
Thumbnails.of("images/test.jpg").size(1280, 1024).toOutputStream(os);
} /**
* 输出到BufferedImage
*
* @throws IOException
*/
private void test9() throws IOException {
/**
* asBufferedImage() 返回BufferedImage
*/
BufferedImage thumbnail = Thumbnails.of("images/test.jpg").size(1280, 1024).asBufferedImage();
ImageIO.write(thumbnail, "jpg", new File("C:/image_1280x1024_BufferedImage.jpg"));
}
}
 

其他的具体方法细节可以自己去查看官方的API或者网络上的其他资源。

关于图片失真或变红问题

有的jpg图片在转换压缩后,会变红, 可能是代码中把png图片强制转换成了jpg了, 尽量原始图片是什么后缀,压缩里也用什么后缀, 或者统一全转成png

BufferedImage bufImg = Thumbnails.of(mfInputStream).width(120).keepAspectRatio(true).outputQuality(0.5).asBufferedImage();// 压缩代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();// 存储图片文件byte数组
ImageIO.write(bufImg, "png", bos); // 图片写入到 ImageOutputStream, 最好jpg对应jpg,png对应png,本处直接固定成png
InputStream ossNeedStream = new ByteArrayInputStream(bos.toByteArray());
while ((length = ossNeedStream.read(b)) > 0) {
fos.write(b, 0, length);
}

参考博客:

http://blog.csdn.net/wangpeng047/article/details/17610451

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

http://www.cnblogs.com/miskis/p/5500822.html

转载请注明出处:http://www.cnblogs.com/linkstar/p/7412012.html

参考

参考自java使用google开源工具实现图片压缩==>https://www.cnblogs.com/linkstar/p/7412012.html

java使用google开源工具实现图片压缩【转】的更多相关文章

  1. java使用google开源工具实现图片压缩

    前言 作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情. 现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高清图片,分辨率也是相当的高,当然占用的存储空 ...

  2. Java使用google开源工具Thumbnailator实现图片压缩

    <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</ar ...

  3. java自带BASE64工具进行图片和字符串转换

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  4. java自带BASE64工具进行图片和字符串转换【转】

    java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  5. 四:Java使用google的thumbnailator工具对图片压缩水印等做处理

    Thumbnailator是一个非常好的图片开源工具 使用方法: 在pom中加入以下jar包 <!-- 图片缩略图 图片压缩 水印 start--> <dependency>& ...

  6. Gulp自动化工具之图片压缩

    一.安装node https://nodejs.org/download/ 根据需要选择对应的版本 安装好了之后可以通过node -v参看一下版本 node -v 二.安装gulp npm insta ...

  7. java:图片压缩

    java使用google开源工具实现图片压缩 :http://www.cnblogs.com/linkstar/p/7412012.html

  8. 图片压缩java工具类

    package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.Fil ...

  9. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

随机推荐

  1. Java 设计模式学习

    看完headfirst设计模式,简单总结一下. 写在最前面:设计模式的关心的问题为"弹性.易于维护.易于扩展",通过对模式的应用,让自己的代码能够得到良好的可塑性.但是个人认为不能 ...

  2. BZOJ3874 codevs3361 宅男计划

    AC通道1:http://www.lydsy.com/JudgeOnline/problem.php?id=3874 AC通道2:http://codevs.cn/problem/3361/ [题目分 ...

  3. Linux-sed用法(2)

    本文为转载,原地址为:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html 简介 sed 是一种在线编辑器,它一次处理一行内 ...

  4. hihocoder &num;1300 &colon; 展胜地的鲤鱼旗 dp

    题目链接: http://hihocoder.com/problemset/problem/1300 题解: 先用栈预处理出每个‘)’匹配的‘(’的位子,放在pos数组中. dp[i]表示以i结尾的合 ...

  5. jQuery自学笔记(三):jQuery动画效果

    jQuery隐藏和显示: 使用 hide( ) 和 show( ) 方法来隐藏和显示 HTML 元素: 语法: $(selector).hide(speed,callback); $(selector ...

  6. C&sol;C&plus;&plus;遍历目录下的所有文件(Windows&sol;Linux篇,超详细)

    本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...

  7. python笔记:&num;003&num;PyCharm 的初始设置

    PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...

  8. 读Zepto源码之内部方法

    数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice = emptyArray ...

  9. 《微信小程序组件》收集

    https://github.com/liuqian0413/wxappUI https://github.com/liujians/Wa-UI

  10. Linux常用软件整理

    视频:VLC 音乐:网易云 编辑器:Vim,Vscode 截图:Shutter 远程桌面:Remmina 笔记:NixNote(evernote第三方版本) 屏幕亮度调节:Brightness Con ...