java 图片缩放,区域裁剪,水印,旋转,保持比例等处理
maven 引入jar包
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.12</version>
</dependency>
图片处理工具类
package com.???.utils;
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.Thumbnails.Builder;
import net.coobird.thumbnailator.geometry.Positions;
public class ImageCompressionUtil {
final static String IMG_PATH = "D:/ThumbnailsTest/";
final static String IMG_NAME_JPG = "原图片.jpg";
final static String IMG_NAME_PMG = "PNG原图片.png";
final static String IMG_NAME_WATERMARK = "水印.jpg";
private static void imageCompression(String type) throws IOException{
// TODO Auto-generated method stub
switch(type){
case "指定大小进行缩放1":
/*
* size(宽度, 高度)
* 若图片横比200小,高比300小,不变
* 若图片横比200小,高比300大,高缩小到300,图片比例不变
* 若图片横比200大,高比300小,横缩小到200,图片比例不变
* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(200, 300).toFile(IMG_PATH+"指定大小进行缩放1(200x300).jpg");
break;
case "指定大小进行缩放2":
/*
* keepAspectRatio(false):按照比例缩放的
* keepAspectRatio(true):按照大小缩放的
* 默认:true
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(200, 300).keepAspectRatio(true).toFile(IMG_PATH+"指定大小进行缩放2(200x300).jpg");
break;
case "按照比例进行缩放25%":
/**
* scale(比例)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(0.25f).toFile(IMG_PATH+"按照比例进行缩放25%.jpg");
break;
case "按照比例进行缩放100%":
/**
* scale(比例)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1.0f).toFile(IMG_PATH+"按照比例进行缩放100%.jpg");
break;
case "按照比例进行缩放125%":
/**
* scale(比例)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1.25f).toFile(IMG_PATH+"按照比例进行缩放125%.jpg");
break;
case "顺时针旋转90度":
/**
* rotate(角度),正数:顺时针 负数:逆时针
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).rotate(90).toFile(IMG_PATH+"顺时针旋转90度.jpg");
break;
case "逆时针旋转90度":
/**
* rotate(角度),正数:顺时针 负数:逆时针
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).rotate(-90).toFile(IMG_PATH+"逆时针旋转90度.jpg");
break;
case "图片水印-右下角":
/**
* watermark(位置,水印图,透明度)
* outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG)
.size(1280,1024)
.watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(IMG_PATH+IMG_NAME_WATERMARK)),0.5f)
.outputQuality(0.8f)
.toFile(IMG_PATH+"图片水印-右下角.jpg");
break;
case "图片水印-中间":
/**
* watermark(位置,水印图,透明度)
* outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG)
.size(1280,1024)
.watermark(Positions.CENTER,ImageIO.read(new File(IMG_PATH+IMG_NAME_WATERMARK)),0.5f)
.outputQuality(0.8f)
.toFile(IMG_PATH+"图片水印-中间.jpg");
break;
case "裁剪-中心":
/**
* 图片中心400*400的区域
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG)
.sourceRegion(Positions.CENTER,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile(IMG_PATH+"裁剪-中心400x400的区域.jpg");
break;
case "裁剪-右下":
/**
* 图片右下400*400的区域
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG)
.sourceRegion(Positions.BOTTOM_RIGHT,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile(IMG_PATH+"裁剪-右下400x400的区域.jpg");
break;
case "裁剪-指定坐标":
/**
* 指定坐标
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG)
.sourceRegion(600,500,400,400)
.size(200,200)
.keepAspectRatio(false)
.toFile(IMG_PATH+"裁剪-指定坐标区域.jpg");
break;
case "转化图像格式jpg-png":
/**
* outputFormat(图像格式)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).outputFormat("png").toFile(IMG_PATH+"转化图像格式jpg-png.png");
break;
case "转化图像格式jpg-gif":
/**
* outputFormat(图像格式)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).outputFormat("gif").toFile(IMG_PATH+"转化图像格式jpg-gif.gif");
break;
case "转化图像格式png-jpg":
/**
* outputFormat(图像格式)
*/
Thumbnails.of(IMG_PATH+IMG_NAME_PMG).size(1280,1024).outputFormat("jpg").toFile(IMG_PATH+"转化图像格式png-jpg.jpg");
break;
case "输出到OutputStream":
/**
* toOutputStream(流对象)
*/
OutputStream os = new FileOutputStream(IMG_PATH+"输出到OutputStream.jpg");
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).toOutputStream(os);
break;
case "输出到BufferedImage":
/**
* asBufferedImage()返回BufferedImage
*/
BufferedImage thumbnail=Thumbnails.of(IMG_PATH+IMG_NAME_JPG).size(1280,1024).asBufferedImage();
ImageIO.write(thumbnail,"jpg",new File(IMG_PATH+"输出到BufferedImage.jpg"));
break;
case "场景一-图片尺寸不变,修改图片文件类型":
/**
* outputFormat:输出的图片格式。注意使用该方法后toFile()方法不要再含有文件类型的后缀了,否则会生成 XXX.png.png 的图片。
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1f).outputFormat("png").toFile(IMG_PATH+"场景一-图片尺寸不变,修改图片文件类型");
break;
case "场景二-图片尺寸不变,压缩图片文件大小":
/**
* outputQuality:输出的图片质量,范围:0.0~1.0,1为最高质量。
* 注意使用该方法时输出的图片格式必须为jpg(即outputFormat("jpg")。其他格式我没试过,感兴趣的自己可以试试)。
* 否则若是输出png格式图片,则该方法作用无效【这其实应该算是bug】。
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).scale(1f).outputQuality(0.25f).outputFormat("jpg").toFile(IMG_PATH+"场景二-图片尺寸不变,压缩图片文件大小");
break;
case "场景三-压缩至指定图片尺寸,不保持图片比例":
/**
* 例如:横400高300
*/
Thumbnails.of(IMG_PATH+IMG_NAME_JPG).forceSize(400, 300).toFile(IMG_PATH+"场景三-压缩至指定图片尺寸,不保持图片比例.jpg");
break;
case "场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉":
/**
* 例如:横400高300
*/
String imagePath = IMG_PATH+IMG_NAME_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(IMG_PATH+"场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉");
break;
default:
break;
}
}
public static void main(String[] args) throws IOException {
imageCompression("指定大小进行缩放1");
imageCompression("指定大小进行缩放2");
imageCompression("按照比例进行缩放25%");
imageCompression("按照比例进行缩放100%");
imageCompression("按照比例进行缩放125%");
imageCompression("顺时针旋转90度");
imageCompression("逆时针旋转90度");
imageCompression("图片水印-右下角");
imageCompression("图片水印-中间");
imageCompression("裁剪-中心");
imageCompression("裁剪-右下");
imageCompression("裁剪-指定坐标");
imageCompression("转化图像格式jpg-png");
imageCompression("转化图像格式jpg-gif");
imageCompression("转化图像格式png-jpg");
imageCompression("输出到OutputStream");
imageCompression("输出到BufferedImage");
imageCompression("场景一-图片尺寸不变,修改图片文件类型");
imageCompression("场景二-图片尺寸不变,压缩图片文件大小");
imageCompression("场景三-压缩至指定图片尺寸,不保持图片比例");
imageCompression("场景四-压缩至指定图片尺寸,保持图片不变形,多余部分裁剪掉");
}
}
效果
图片压缩效果杠杠的,原图片20M,压缩25%后才248KB
原图片(20M)
按照比例进行缩放25%后(248KB)
压缩功能很强大,不仔细看你能看出差别吗?
代码例子下载链接: https://download.csdn.net/download/qweasdzxc01233210/12760170