thumbnailator 介绍
Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例。
地址:
Thumbnailator官网:http://code.google.com/p/thumbnailator/
GitHub地址:https://github.com/coobird/thumbnailator
使用方式
maven 引入依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.18</version>
</dependency>
按质量或比例压缩
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;
public class Test1 {
public static void main(String[] args) throws Exception {
Thumbnails.of(new File("D:/img.jpg"))
.scale(1f) //图片大小(长宽)压缩比例 从0-1,1表示原图
.outputQuality(0.5f) //图片质量压缩比例 从0-1,越接近1质量越好
.toOutputStream(new FileOutputStream("D:/img50.jpg"));
}
}
按大小和比例缩放
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;
public class Test21 {
public static void main(String[] args) throws Exception {
Thumbnails.of(new File("D:/img.jpg"))
.size(500, 300) // 图片比例不变
.toOutputStream(new FileOutputStream("D:/img_500_300.jpg"));
}
}
按大小和比例缩放
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;
public class Test22 {
public static void main(String[] args) throws Exception {
Thumbnails.of(new File("D:/showqrcode.jpg"))
.forceSize(500, 300) //不保持图片比例
.toOutputStream(new FileOutputStream("D:/showqrcode_500_300.jpg"));
}
}
旋转
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;
public class Test3 {
public static void main(String[] args) throws Exception {
Thumbnails.of(new File("D:/img.jpg"))
.rotate(90f) //向右旋转
.toOutputStream(new FileOutputStream("D:/img.jpg"));
}
}
加水印
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
public class Test4 {
public static void main(String[] args) throws IOException {
Thumbnails.of("D:/img.jpg")
.size(1280, 1024)
.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:/watermark.jpg")),
0.5f) //位置,水印来源,透明度
.outputQuality(0.8f)
.toFile("D:/img.jpg");
}
}
裁剪
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");
}
转化图像格式
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
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
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"));
}
ps: 这个工具无法正确压缩出png格式的图片。
因为png本身就是一种无损的图片格式,而jpg是一种压缩的图片格式;
当前方法目的是为了在尽可能不丢失图片质量的情况下进行的压缩;
建议将图片压缩后的格式设置成jpg来解决;.outputFormat("jpg")
工具源码本身最后还是调用jdk中的ImageIO.createImageOutputStream(fos);来实现的;