当前位置: 首页 > 工具软件 > TwelveMonkeys > 使用案例 >

图片处理之thumbnailator和TwelveMonkeys的使用

夏昌胤
2023-12-01

一、介绍

1、thumbnailatorhttps://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、TwelveMonkeyshttps://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目录中。
缩略图最终存放为:

  • path/to/output/thumbnail.apple.jpg
  • path/to/output/thumbnail.banana.jpg
  • path/to/output/thumbnail.cherry.jpg

缩略图的新名称依据Rename枚举类的选择而改变。

 类似资料: