Java案例如何实现缩略图?

wen python案例 4

本文目录导读:

Java案例如何实现缩略图?

  1. 使用Java原生API (ImageIO)
  2. 使用Thumbnailator库(推荐)
  3. 使用imgscalr库
  4. 完整的高级示例
  5. 推荐方案

我来详细介绍Java实现缩略图的几种常用方法:

使用Java原生API (ImageIO)

基础缩略图生成

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ThumbnailGenerator {
    public static void createThumbnail(String sourcePath, String targetPath, 
                                       int targetWidth, int targetHeight) throws IOException {
        File sourceFile = new File(sourcePath);
        BufferedImage originalImage = ImageIO.read(sourceFile);
        // 创建缩略图
        BufferedImage thumbnail = new BufferedImage(targetWidth, targetHeight, 
                                                     BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = thumbnail.createGraphics();
        // 设置渲染质量
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                             RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
                             RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                             RenderingHints.VALUE_ANTIALIAS_ON);
        // 绘制缩略图
        g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
        g2d.dispose();
        // 保存缩略图
        String format = sourcePath.substring(sourcePath.lastIndexOf(".") + 1);
        ImageIO.write(thumbnail, format, new File(targetPath));
    }
}

保持比例的缩略图

public class ProportionalThumbnail {
    public static void createProportionalThumbnail(String sourcePath, String targetPath, 
                                                   int maxWidth, int maxHeight) throws IOException {
        BufferedImage originalImage = ImageIO.read(new File(sourcePath));
        // 计算缩放比例
        int originalWidth = originalImage.getWidth();
        int originalHeight = originalImage.getHeight();
        double widthRatio = (double) maxWidth / originalWidth;
        double heightRatio = (double) maxHeight / originalHeight;
        double ratio = Math.min(widthRatio, heightRatio);
        int scaledWidth = (int) (originalWidth * ratio);
        int scaledHeight = (int) (originalHeight * ratio);
        // 创建缩略图
        BufferedImage thumbnail = new BufferedImage(scaledWidth, scaledHeight, 
                                                     BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = thumbnail.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                             RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
        g2d.dispose();
        ImageIO.write(thumbnail, "jpg", new File(targetPath));
    }
}

使用Thumbnailator库(推荐)

Maven依赖

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

基本用法

import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;
public class ThumbnailatorExample {
    // 按指定大小生成缩略图
    public static void resizeToSize(String sourcePath, String targetPath, 
                                    int width, int height) throws IOException {
        Thumbnails.of(new File(sourcePath))
                  .size(width, height)
                  .toFile(new File(targetPath));
    }
    // 按比例缩放
    public static void scaleByFactor(String sourcePath, String targetPath, 
                                     double scaleFactor) throws IOException {
        Thumbnails.of(new File(sourcePath))
                  .scale(scaleFactor)
                  .toFile(new File(targetPath));
    }
    // 高质量缩略图
    public static void highQualityThumbnail(String sourcePath, String targetPath, 
                                            int width, int height) throws IOException {
        Thumbnails.of(new File(sourcePath))
                  .size(width, height)
                  .outputQuality(0.85)  // 设置输出质量
                  .toFile(new File(targetPath));
    }
    // 批量处理
    public static void batchResize(String sourceDir, String targetDir, 
                                   int width, int height) throws IOException {
        Thumbnails.of(new File(sourceDir).listFiles())
                  .size(width, height)
                  .outputFormat("jpg")
                  .toFiles(new File(targetDir));
    }
}

使用imgscalr库

Maven依赖

<dependency>
    <groupId>org.imgscalr</groupId>
    <artifactId>imgscalr-lib</artifactId>
    <version>4.2</version>
</dependency>

示例代码

import org.imgscalr.Scalr;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImgscalrExample {
    public static void createThumbnail(String sourcePath, String targetPath, 
                                       int targetSize) throws IOException {
        BufferedImage originalImage = ImageIO.read(new File(sourcePath));
        // 使用高质量缩放
        BufferedImage thumbnail = Scalr.resize(originalImage, 
                                               Scalr.Method.QUALITY,
                                               Scalr.Mode.FIT_TO_WIDTH,
                                               targetSize);
        ImageIO.write(thumbnail, "jpg", new File(targetPath));
    }
    // 带裁剪的缩略图
    public static void createCroppedThumbnail(String sourcePath, String targetPath, 
                                              int width, int height) throws IOException {
        BufferedImage originalImage = ImageIO.read(new File(sourcePath));
        // 先缩放后裁剪
        BufferedImage scaled = Scalr.resize(originalImage, 
                                            Scalr.Method.QUALITY,
                                            Scalr.Mode.FIT_EXACT,
                                            width, height);
        ImageIO.write(scaled, "jpg", new File(targetPath));
    }
}

完整的高级示例

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
public class AdvancedThumbnailGenerator {
    public static class ThumbnailConfig {
        private int maxWidth;
        private int maxHeight;
        private float quality;
        private boolean keepAspectRatio;
        private String formatName;
        public ThumbnailConfig() {
            this.maxWidth = 200;
            this.maxHeight = 200;
            this.quality = 0.8f;
            this.keepAspectRatio = true;
            this.formatName = "jpg";
        }
        // getters and setters...
    }
    public static void generateThumbnail(String sourcePath, String targetPath, 
                                         ThumbnailConfig config) throws IOException {
        File sourceFile = new File(sourcePath);
        if (!sourceFile.exists()) {
            throw new IOException("源文件不存在: " + sourcePath);
        }
        BufferedImage originalImage = ImageIO.read(sourceFile);
        if (originalImage == null) {
            throw new IOException("无法读取图片: " + sourcePath);
        }
        // 计算目标尺寸
        int targetWidth = config.maxWidth;
        int targetHeight = config.maxHeight;
        if (config.keepAspectRatio) {
            double ratio = Math.min(
                (double) config.maxWidth / originalImage.getWidth(),
                (double) config.maxHeight / originalImage.getHeight()
            );
            targetWidth = (int) (originalImage.getWidth() * ratio);
            targetHeight = (int) (originalImage.getHeight() * ratio);
        }
        // 创建缩略图
        BufferedImage thumbnail = new BufferedImage(targetWidth, targetHeight, 
                                                     BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = thumbnail.createGraphics();
        // 设置高质量的渲染参数
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
                             RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
                             RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                             RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, 
                             RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
        g2d.dispose();
        // 保存缩略图(使用质量控制)
        saveImageWithQuality(thumbnail, targetPath, config);
    }
    private static void saveImageWithQuality(BufferedImage image, String path, 
                                             ThumbnailConfig config) throws IOException {
        // 获取图像写入器
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(config.formatName);
        if (!writers.hasNext()) {
            throw new IOException("不支持的图片格式: " + config.formatName);
        }
        ImageWriter writer = writers.next();
        ImageWriteParam param = writer.getDefaultWriteParam();
        // 设置压缩质量
        if (param.canWriteCompressed()) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(config.quality);
        }
        // 写入文件
        try (FileOutputStream fos = new FileOutputStream(path);
             ImageOutputStream ios = ImageIO.createImageOutputStream(fos)) {
            writer.setOutput(ios);
            writer.write(null, new javax.imageio.IIOImage(image, null, null), param);
        } finally {
            writer.dispose();
        }
    }
    // 使用示例
    public static void main(String[] args) {
        try {
            ThumbnailConfig config = new ThumbnailConfig();
            config.setMaxWidth(300);
            config.setMaxHeight(300);
            config.setQuality(0.85f);
            generateThumbnail("original.jpg", "thumbnail.jpg", config);
            System.out.println("缩略图生成成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

推荐方案

  1. 简单需求:使用Java原生ImageIO即可
  2. 生产环境:推荐使用Thumbnailator库,功能强大且易用
  3. 批量处理:Thumbnailator提供批量处理功能
  4. 高性能要求:考虑使用imgscalr库

选择哪种方案取决于你的具体需求,Thumbnailator是最平衡的选择。

抱歉,评论功能暂时关闭!