一、介绍
1、thumbnailator:https://github.com/coobird/thumbnailator
thumbnailator是图片处理的工具类,提供了很多图片处理的便捷的方法,这样我们就不要用jdk底层的ImageIO类了
thumbnailator的功能有按比例缩放,固定尺寸缩放,按尺寸等比缩放,旋转,加水印,压缩图片质量。thumbnailator固定尺寸缩放有可能会造成图片变型,有的时候我们可能需要固定尺寸并等比缩放,不够的地方补上空白。它没有提供直接的功能。下面是自己写的代码
public static void reduceImg(String srcImageFile, String destImageFile, int width, int height, boolean isScale) throws IOException {
InputStream inputStream = new FileInputStream(srcImageFile);
OutputStream outputStream = new FileOutputStream(destImageFile);
BufferedImage bufferedImage = ImageIO.read(inputStream);
int sWidth = bufferedImage.getWidth();
int sHeight = bufferedImage.getHeight();
int diffWidth = 0;
int diffHeight = 0;
if (isScale) {
if ((double) sWidth / width > (double) sHeight / height) {
int height2 = width * sHeight / sWidth;
diffHeight = (height - height2) / 2;
} else if ((double) sWidth / width < (double) sHeight / height) {
int width2 = height * sWidth / sHeight;
diffWidth = (width - width2) / 2;
}
}
BufferedImage nbufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
nbufferedImage.getGraphics().fillRect(0, 0, width, height);//填充整个屏幕
nbufferedImage.getGraphics().drawImage(bufferedImage, diffWidth, diffHeight, width - diffWidth * 2, height - diffHeight * 2, null); // 绘制缩小后的图
ImageIO.write(nbufferedImage, FileUtils.getExtensionName(srcImageFile), outputStream);
outputStream.close();
inputStream.close();
}
2、TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys
TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了。jdk的ImageIO有自动发现功能,会自动查找相关的编解码类并使用,而不使用jdk默认的编解码类,所以使用这个库是完全无入侵的
TwelveMonkeys是一个图片编解码库,支持bmp,jpeg,tiff,pnm,psd等。jdk本身也支持一些图片的处理,如jpeg,bmp,png,但是jdk的图片编解码库不是很强。
为什么需要TwelveMonkeys?我在处理jpeg图片的时候,发现用jdk自带的jpeg解析器不能解析所有的jpeg格式文件(如cmyk)。出现unsupported formate 错误,用这个库后,没有出现错误。
二、示例
1.创建缩略图
Thumbnails.of(new File("original.jpg")).size(160, 160).toFile(new File("thumbnail.jpg"));
在这个例子中,original.jpg的图像被调整大小,然后保存为thumbnail.jpg.
或者Thumbnailator将接受文件名作为字符串。不需要使用文件对象来指定图像文件:
Thumbnails.of("original.jpg").size(160, 160) .toFile("thumbnail.jpg");
2.创建带有旋转和水印的缩略图
Thumbnails.of(new File("original.jpg")).size(160, 160).rotate(90).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f).outputQuality(0.8).toFile(new File("image-with-watermark.jpg"));
在这个例子中,original.jpg图像被调整大小,然后顺时针旋转90度,然后水印放在右下角,其中一半是透明的,80%压缩质量设置,然后保存到image-with-watermark.jpg。
3.创建缩略图并写入输出流
OutputStream os = ...;
Thumbnails.of("large-picture.jpg").size(200, 200).outputFormat("png").toOutputStream(os);
在这个例子中,图像large-picture.jpg图像最大尺寸被调整为200×200(保持原始图像的高宽比),并以PNG格式输出。
4.创建固定大小缩略图
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).asBufferedImage();
上面的代码获取原始图像,创建200x200像素缩略图,并将结果存储在缩略图中。
4.按给定因子缩放图像
BufferedImage originalImage = ImageIO.read(new File("original.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage).scale(0.25).asBufferedImage();
上面的代码在原始图像中获取图像并创建缩略图,该缩略图是原始图像的25%,并使用默认缩放技术以使缩略图存储在缩略图中。
5.创建缩略图时旋转图像
BufferedImage originalImage = ImageIO.read(new File("original.jpg"));
BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).rotate(90).asBufferedImage();
上面的代码获取原始图像,并创建一个缩略图,顺时针旋转90度。
6.创建带水印的缩略图
BufferedImage originalImage = ImageIO.read(new File("original.jpg"));
BufferedImage watermarkImage = ImageIO.read(new File("watermark.png"));
BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).watermark(Positions.BOTTOM_RIGHT, watermarkImage, 0.5f) .asBufferedImage();
水印的透明度可以通过改变最后的参数来调整,0.0F是完全透明的,1.0F是完全不透明的。
水印的位置可以通过选择Positions枚举类来设置。
7.将缩略图写入特定目录
File destinationDir = new File("path/to/output");
Thumbnails.of("apple.jpg", "banana.jpg", "cherry.jpg").size(200, 200).toFiles(destinationDir,Rename.PREFIX_DOT_THUMBNAIL);
此示例将获取源图像,以新名称命名,生成200x200的缩略图并放在指定的destinationDir目录中。
缩略图最终存放为:
缩略图的新名称依据Rename枚举类的选择而改变。