Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。还支持对一个目录的所有图片进行批量处理操作。
//size(宽度, 高度)
/*
* 若图片横比200小,高比300小,不变
* 若图片横比200小,高比300大,高缩小到300,图片比例不变
* 若图片横比200大,高比300小,横缩小到200,图片比例不变
* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
*/
Thumbnails.of("images/a380_1280x1024.jpg")
.size(200, 300)
.toFile("c:/a380_200x300.jpg");
Thumbnails.of("images/a380_1280x1024.jpg")
.size(2560, 2048)
.toFile("c:/a380_2560x2048.jpg");
//scale(比例)
Thumbnails.of("images/a380_1280x1024.jpg")
.scale(0.25f)
.toFile("c:/a380_25%.jpg");
Thumbnails.of("images/a380_1280x1024.jpg")
.scale(1.10f)
.toFile("c:/a380_110%.jpg");
//keepAspectRatio(false)默认是按照比例缩放的
Thumbnails.of("images/a380_1280x1024.jpg")
.size(200,200)
.keepAspectRatio(false)
.toFile("c:/a380_200x200.jpg");
//rotate(角度),正数:顺时针负数:逆时针
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.rotate(90)
.toFile("c:/a380_rotate+90.jpg");
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.rotate(-90)
.toFile("c:/a380_rotate-90.jpg");
//watermark(位置,水印图,透明度)
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.watermark(Positions.BOTTOM_RIGHT,ImageIO.read(newFile("images/watermark.png")),0.5f)
.outputQuality(0.8f)
.toFile("c:/a380_watermark_bottom_right.jpg");
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.watermark(Positions.CENTER,ImageIO.read(newFile("images/watermark.png")),0.5f)
.outputQuality(0.8f)
.toFile("c:/a380_watermark_center.jpg");
//sourceRegion()
//图片中心400*400的区域
Thumbnails.of("images/a380_1280x1024.jpg")
.sourceRegion(Positions.CENTER,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile("c:/a380_region_center.jpg");
//图片右下400*400的区域
Thumbnails.of("images/a380_1280x1024.jpg")
.sourceRegion(Positions.BOTTOM_RIGHT,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile("c:/a380_region_bootom_right.jpg");
//指定坐标
Thumbnails.of("images/a380_1280x1024.jpg")
.sourceRegion(600,500,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile("c:/a380_region_coord.jpg");
//outputFormat(图像格式)
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.outputFormat("png")
.toFile("c:/a380_1280x1024.png");
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.outputFormat("gif")
.toFile("c:/a380_1280x1024.gif");
//toOutputStream(流对象)
OutputStreamos=newFileOutputStream("c:/a380_1280x1024_OutputStream.png");
Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.toOutputStream(os);
//asBufferedImage()返回BufferedImage
BufferedImagethumbnail=Thumbnails.of("images/a380_1280x1024.jpg")
.size(1280,1024)
.asBufferedImage();
ImageIO.write(thumbnail,"jpg",newFile("c:/a380_1280x1024_BufferedImage.jpg"));
Thumbnails.of("F:\\image\\IMG_20131229_114806.png")
.scale(1f)
.outputFormat("jpg")
.toFile("F:\\image\\output\\IMG_20131229_114806");
Thumbnails.of("F:\\image\\IMG_20131229_114806.png")
.scale(1f)
.outputQuality(0.25f)
.outputFormat("jpg")
.toFile("F:\\image\\output\\IMG_20131229_114806");
Thumbnails.of("F:\\image\\IMG_20131229_114806.png")
.forceSize(400, 300)
.toFile("F:\\image\\output\\IMG_20131229_114806");
String imagePath = "F:\\image\\IMG_20131229_114806.jpg";
BufferedImage image = ImageIO.read(new File(imagePath));
Builder<BufferedImage> builder = null;
int imageWidth = image.getWidth();
int imageHeitht = image.getHeight();
if ((float)300 / 400 != (float)imageWidth / imageHeitht) {
if (imageWidth > imageHeitht) {
image = Thumbnails.of(imagePath).height(300).asBufferedImage();
} else {
image = Thumbnails.of(imagePath).width(400).asBufferedImage();
}
builder = Thumbnails.of(image).sourceRegion(Positions.CENTER, 400, 300).size(400, 300);
} else {
builder = Thumbnails.of(image).size(400, 300);
}
builder.outputFormat("jpg").toFile("F:\\image\\output\\IMG_20131229_114806");