本文目录导读:

我来详细介绍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();
}
}
}
推荐方案
- 简单需求:使用Java原生ImageIO即可
- 生产环境:推荐使用Thumbnailator库,功能强大且易用
- 批量处理:Thumbnailator提供批量处理功能
- 高性能要求:考虑使用imgscalr库
选择哪种方案取决于你的具体需求,Thumbnailator是最平衡的选择。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播