Java操作图片主要依赖java.awt.image和javax.imageio两大核心包,结合BufferedImage、ImageIO等类可实现图片加载、编辑、格式转换及压缩等功能,以下从基础操作到进阶应用分模块说明。

图片加载与保存
图片加载是操作的第一步,可通过ImageIO.read()方法实现,支持常见格式如JPG、PNG、GIF等。
BufferedImage image = ImageIO.read(new File("input.jpg")); // 从文件加载
BufferedImage image = ImageIO.read(new URL("https://example.com/image.png")); // 从URL加载
保存图片时需指定格式,通过ImageIO.write()方法完成:
ImageIO.write(image, "PNG", new File("output.png")); // 保存为PNG
ImageIO.write(image, "JPG", new File("output.jpg")); // 保存为JPG
注意:JPG格式保存时默认会压缩,可通过ImageWriteParam控制压缩质量。
图片基础编辑
尺寸调整
使用getScaledInstance()或AffineTransform类调整图片大小:

BufferedImage scaledImage = new BufferedImage(
targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB
);
Graphics2D graphics = scaledImage.createGraphics();
graphics.drawImage(image, 0, 0, targetWidth, targetHeight, null);
graphics.dispose();
裁剪图片
通过getSubimage()方法截取指定区域:
BufferedImage croppedImage = image.getSubimage(x, y, width, height);
旋转与翻转
利用AffineTransform实现旋转:
AffineTransform transform = new AffineTransform(); transform.rotate(Math.toRadians(angle), image.getWidth()/2, image.getHeight()/2); AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); BufferedImage rotatedImage = op.filter(image, null);
翻转可通过scale()方法实现水平或垂直翻转。
图片处理进阶
格式转换
不同图片格式对应不同的BufferedImage类型(如TYPE_INT_RGB用于JPG,TYPE_INT_ARGB用于PNG带透明通道),转换时需注意类型匹配:

BufferedImage rgbImage = new BufferedImage(
image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB
);
rgbImage.getGraphics().drawImage(image, 0, 0, null);
图片压缩
JPG压缩可通过ImageWriter设置压缩参数:
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.7f); // 质量0.0-1.0
水印添加
通过Graphics2D绘制文字或图片水印:
Graphics2D graphics = image.createGraphics();
graphics.setColor(Color.WHITE);
graphics.setFont(new Font("宋体", Font.BOLD, 20));
graphics.drawString("水印文字", x, y);
graphics.dispose();
注意事项
- 资源释放:使用
Graphics2D后需调用dispose()避免内存泄漏。 - 异常处理:
ImageIO.read()可能抛出IOException,需进行捕获处理。 - 格式兼容性:部分格式(如BMP)不支持透明通道,需提前验证。
- 性能优化:大图片操作时建议使用
BufferedImage的子图像或分块处理,避免内存溢出。
通过以上方法,Java可灵活实现图片的各类操作,结合第三方库(如Thumbnailator、Apache Imaging)可进一步简化开发流程,满足复杂业务需求。




















