上一篇
在Java中旋转图片,通常使用
Graphics2D类的
rotate()方法结合
AffineTransform实现,先获取图像的Graphics2D对象,设定旋转角度和锚点,再调用
drawImage()绘制旋转后的图像,也可通过
AffineTransformOp创建变换操作直接处理BufferedImage。
在Java中旋转图片是图像处理的常见需求,无论是调整用户上传的图片方向还是实现特效,都需要掌握核心API和优化技巧,以下是详细实现方案:
核心方法:使用Java原生Graphics2D
Java的Graphics2D类提供基础的图像旋转功能,适合简单场景。

代码示例:旋转任意角度
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ImageRotator {
public static void rotateImage(String inputPath, String outputPath, double degrees) {
try {
// 1. 读取原始图片
BufferedImage originalImage = ImageIO.read(new File(inputPath));
// 2. 计算旋转后的画布尺寸
double radians = Math.toRadians(degrees);
double sin = Math.abs(Math.sin(radians));
double cos = Math.abs(Math.cos(radians));
int newWidth = (int) Math.round(originalImage.getWidth() * cos + originalImage.getHeight() * sin);
int newHeight = (int) Math.round(originalImage.getWidth() * sin + originalImage.getHeight() * cos);
// 3. 创建新画布
BufferedImage rotatedImage = new BufferedImage(newWidth, newHeight, originalImage.getType());
Graphics2D g2d = rotatedImage.createGraphics();
// 4. 设置抗锯齿和旋转中心点
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.translate((newWidth - originalImage.getWidth()) / 2, (newHeight - originalImage.getHeight()) / 2);
g2d.rotate(radians, originalImage.getWidth() / 2.0, originalImage.getHeight() / 2.0);
// 5. 绘制旋转后的图像
g2d.drawImage(originalImage, 0, 0, null);
g2d.dispose(); // 释放资源
// 6. 保存结果
ImageIO.write(rotatedImage, "PNG", new File(outputPath));
System.out.println("图片旋转完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
rotateImage("input.jpg", "output.png", 45); // 旋转45度
}
}
关键参数说明
- 旋转中心点:通过
translate()调整坐标系,确保围绕图片中心旋转。 - 抗锯齿:
RenderingHints.KEY_ANTIALIASING提升边缘平滑度。 - 画布尺寸计算:动态计算新尺寸避免内容裁剪。
高效方案:使用第三方库Thumbnailator
对于复杂场景(如批量处理),推荐使用开源库Thumbnailator(需添加Maven依赖):
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.19</version>
</dependency>
代码示例:一键旋转并保存
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import java.io.File;
public class ThumbnailatorRotate {
public static void main(String[] args) {
try {
Thumbnails.of(new File("input.jpg"))
.scale(1.0) // 保持原尺寸
.rotate(90) // 旋转90度(顺时针)
.outputFormat("jpg")
.toFile("output_thumbnailator.jpg");
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势
- 简洁API:链式调用减少代码量
- 自适应画布:自动处理旋转后尺寸
- 质量优化:内置双线性插值算法
特殊场景:旋转后裁剪保留主体
结合旋转与裁剪,避免留白区域:

// 接Graphics2D示例代码 g2d.rotate(radians, originalImage.getWidth() / 2.0, originalImage.getHeight() / 2.0); g2d.drawImage(originalImage, 0, 0, null); g2d.dispose(); // 裁剪透明边缘(仅限PNG) Rectangle cropArea = findNonTransparentArea(rotatedImage); BufferedImage croppedImage = rotatedImage.getSubimage(cropArea.x, cropArea.y, cropArea.width, cropArea.height);
注意事项
- 图像类型兼容性:
BufferedImage.TYPE_INT_ARGB支持透明度(PNG适用)- JPG格式需用
TYPE_INT_RGB(忽略透明度)
- 性能优化:
- 大尺寸图片先缩放再旋转
- 批量处理使用线程池
- 方向元数据:
- 手机拍摄的图片可能含
EXIF方向标签,需用MetadataExtractor预处理
- 手机拍摄的图片可能含
| 方法 | 适用场景 | 优势 |
|---|---|---|
Graphics2D |
简单旋转、自定义逻辑 | 无需第三方库 |
Thumbnailator |
批量处理、高效需求 | 自动尺寸调整,代码简洁 |
推荐选择:
- 学习目的 → 原生
Graphics2D- 生产环境 →
Thumbnailator或Imgscalr
引用说明:
Graphics2D文档:Oracle官方Java Docs- Thumbnailator源码:GitHub仓库
- EXIF处理指南:Metadata Extractor

