Bootstrap

Java使用Thumbnailator图片处理指南

使用Thumbnailator进行图片处理

Thumbnailator是一个简单且功能强大的Java库,用于生成缩略图和执行其他图片处理任务。在这篇博客中,我们将介绍如何使用Thumbnailator进行图片的缩放、裁剪、旋转等操作,并通过一些代码示例来展示其强大功能。

1. 引入依赖

首先,在你的项目中添加Thumbnailator的依赖。以Maven项目为例,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.20</version>
</dependency>

2. 基本使用

2.1 缩放图片

缩放图片是Thumbnailator的基本功能之一。以下代码演示了如何将图片缩放到指定的大小:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageResizer {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(200, 300)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,Thumbnails.of("input.jpg")加载了源图片,size(200, 300)指定了目标图片的宽度和高度,toFile("output.jpg")则将处理后的图片保存到文件。

2.2 保持宽高比

有时我们希望缩放图片但保持其宽高比。这可以通过scale方法实现:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageResizer {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .scale(0.5)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码将图片缩放到原始大小的50%。

2.3 裁剪图片

Thumbnailator也支持裁剪图片。以下代码演示了如何裁剪图片的中央区域:

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

import java.io.File;
import java.io.IOException;

public class ImageCropper {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .sourceRegion(Positions.CENTER, 200, 200)
                      .size(200, 200)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

sourceRegion(Positions.CENTER, 200, 200)方法指定从图片中央裁剪一个200x200的区域。

2.4 旋转图片

我们还可以使用Thumbnailator旋转图片。以下代码演示了如何将图片顺时针旋转90度:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageRotator {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .rotate(90)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

rotate(90)方法将图片顺时针旋转90度。

3. 高级使用

3.1 批量处理

Thumbnailator还支持批量处理图片。以下代码演示了如何将一个目录中的所有图片缩放到指定大小:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class BatchImageResizer {
    public static void main(String[] args) {
        try {
            Thumbnails.of(new File("inputDir").listFiles())
                      .size(200, 300)
                      .toFiles(Rename.PREFIX_DOT_THUMBNAIL);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码将inputDir目录中的所有图片缩放到200x300,并在文件名前添加.thumbnail前缀。

3.2 转换图片格式

Thumbnailator也可以用于转换图片格式。以下代码演示了如何将JPEG图片转换为PNG格式:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageFormatConverter {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(200, 300)
                      .outputFormat("png")
                      .toFile("output.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

outputFormat("png")方法指定输出图片的格式为PNG。

3.3 添加水印

使用Thumbnailator可以轻松地在图片上添加水印。以下代码演示了如何在图片右下角添加一个水印:

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import net.coobird.thumbnailator.filters.Watermark;

import java.awt.*;
import java.io.File;
import java.io.IOException;

public class ImageWatermarker {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .watermark(Positions.BOTTOM_RIGHT, 
                                 ImageIO.read(new File("watermark.png")), 
                                 0.5f)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

watermark(Positions.BOTTOM_RIGHT, watermarkImage, 0.5f)方法指定了水印的位置、图片和透明度。

3.4 调整图片质量

可以通过Thumbnailator调整输出图片的质量,特别是在生成JPEG格式图片时:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageQualityAdjuster {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .outputQuality(0.8)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

outputQuality(0.8)方法将输出图片的质量设置为80%。

3.5 处理透明度

Thumbnailator也可以处理带有透明度的图片,如PNG格式图片:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class TransparentImageProcessor {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.png")
                      .size(800, 600)
                      .outputFormat("png")
                      .toFile("output.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.6 链式操作

Thumbnailator允许链式操作,可以在一次操作中完成多种图片处理任务:

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

import java.io.File;
import java.io.IOException;

public class ChainOperations {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .rotate(45)
                      .watermark(Positions.BOTTOM_RIGHT, 
                                 ImageIO.read(new File("watermark.png")), 
                                 0.5f)
                      .outputQuality(0.8)
                      .toFile("output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码展示了如何在一次操作中完成图片的缩放、旋转、添加水印和调整质量。

3.7 保存到输出流

Thumbnailator不仅可以将处理后的图片保存到文件,还可以保存到输出流中,比如字节数组输出流:

import net.coobird.thumbnailator.Thumbnails;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class OutputStreamExample {
    public static void main(String[] args) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .toOutputStream(baos);
            byte[] imageBytes = baos.toByteArray();
            // 现在可以使用imageBytes进行其他处理
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.8 读取自输入流

同样地,Thumbnailator也可以从输入流中读取图片:

import net.coobird.thumbnailator.Thumbnails;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("input.jpg");
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
             
            Thumbnails.of(fis)
                      .size(800, 600)
                      .toOutputStream(baos);
            byte[] imageBytes = baos.toByteArray();
            // 现在可以使用imageBytes进行其他处理
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.9 压缩图片

通过调整图片的输出质量,可以实现压缩图片的目的。以下代码演示了如何将JPEG图片压缩到指定的质量水平:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class ImageCompressor {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .outputQuality(0.5)
                      .toFile("compressed_output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,outputQuality(0.5)将输出图片的质量设置为50%。这个参数的取值范围是0到1,值越低,压缩率越高,文件越小,但质量也会越低。

3.10 限制文件大小进行压缩

通过调整图片的尺寸和质量,可以尝试将图片压缩到接近某个目标文件大小。下面是一个示例,通过迭代调整图片质量来接近目标文件大小:

import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileSizeCompressor {
    public static void main(String[] args) {
        try {
            String inputFilePath = "input.jpg";
            String outputFilePath = "compressed_output.jpg";
            long targetFileSize = 100 * 1024; // 目标文件大小为100KB
            compressImage(inputFilePath, outputFilePath, targetFileSize);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void compressImage(String inputFilePath, String outputFilePath, long targetFileSize) throws IOException {
        float quality = 1.0f;
        byte[] imageBytes;

        do {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Thumbnails.of(inputFilePath)
                      .size(800, 600)
                      .outputQuality(quality)
                      .toOutputStream(baos);
            imageBytes = baos.toByteArray();
            quality -= 0.1f;
        } while (imageBytes.length > targetFileSize && quality > 0);

        FileOutputStream fos = new FileOutputStream(outputFilePath);
        fos.write(imageBytes);
        fos.close();
    }
}

3.11 压缩并保持透明度

对于PNG等支持透明度的图片,可以在压缩时保持透明度:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class TransparentImageCompressor {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.png")
                      .size(800, 600)
                      .outputFormat("png")
                      .outputQuality(0.8)
                      .toFile("compressed_output.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.12 结合尺寸调整和质量压缩

通过同时调整图片尺寸和质量,可以更有效地压缩图片文件大小:

import net.coobird.thumbnailator.Thumbnails;

import java.io.File;
import java.io.IOException;

public class SizeAndQualityCompressor {
    public static void main(String[] args) {
        try {
            Thumbnails.of("input.jpg")
                      .size(800, 600)
                      .outputQuality(0.5)
                      .toFile("compressed_output.jpg");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,图片的尺寸被调整到800x600,同时输出质量被设置为50%。这种方法可以显著减少图片文件的大小。

结语

Thumbnailator是一个功能强大且易于使用的Java图片处理库。无论是缩放、裁剪、旋转还是格式转换,Thumbnailator都提供了简洁的API,使这些操作变得非常简单。希望通过这篇博客,你能够更好地了解和使用Thumbnailator进行图片处理。如果你有更多需求,建议查阅Thumbnailator官方文档

;