Java Image I/O API:图像缩放与裁剪 | 指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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方法执行。

推荐