Java图像处理:调整大小(resize)与裁剪(crop)
在现代Java Web和桌面开发中,经常需要以编程方式处理图像:为预览缩小图像、裁剪多余边缘或调整至指定比例。Java标准库(Java SE)中没有用于这些操作的高级统一类,但在java.awt、java.awt.image和javax.imageio包中有一套强大的工具。本文将详细介绍如何使用Java内置工具执行resize(调整大小)和crop(裁剪)操作。
图像处理的主要类
在开始编写代码之前,我们先了解关键类:
javax.imageio.ImageIO– 读取和写入图像(支持PNG、JPEG、BMP、GIF等格式)。java.awt.image.BufferedImage– 可访问像素的位图图像。java.awt.Graphics2D– 用于绘图(缩放、裁剪、叠加)的类。java.awt.geom.AffineTransform– 用于精确缩放的变换矩阵。
1. 调整图像大小(Resize)
最常见的方法是将原始图像重新绘制到具有所需尺寸的新画布上。为了获得高质量结果,请使用RenderingHints。
import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageResizer {
public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) { BufferedImage resized = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = resized.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(original, 0, 0, targetWidth, targetHeight, null); g2d.dispose(); return resized; }
public static void main(String[] args) throws IOException { File input = new File("input.jpg"); BufferedImage source = ImageIO.read(input);
// 缩小至300x200 BufferedImage output = resize(source, 300, 200); ImageIO.write(output, "jpg", new File("resized.jpg")); System.out.println("Resize completed!"); }}重要说明:
- 如果不设置
RenderingHints,结果质量会很低(使用邻近像素插值)。 - 对于带透明度的PNG,请使用
BufferedImage.TYPE_INT_ARGB。 - 不会自动保持宽高比 – 如有需要,请手动计算宽高比。
2. 保持宽高比(Aspect Ratio)
为避免图像变形,请在保持宽高比的情况下计算新尺寸:
public static BufferedImage resizeKeepRatio(BufferedImage original, int maxWidth, int maxHeight) { int origWidth = original.getWidth(); int origHeight = original.getHeight();
double widthRatio = (double) maxWidth / origWidth; double heightRatio = (double) maxHeight / origHeight; double ratio = Math.min(widthRatio, heightRatio);
int newWidth = (int) (origWidth * ratio); int newHeight = (int) (origHeight * ratio);
return resize(original, newWidth, newHeight);}3. 裁剪图像(Crop)
在Java中,裁剪通过getSubi方法执行。