BufferedImage
加载图片并获取Graphics2D
对象,使用drawRect(x, y, width, height)
方法绘制矩形边框,或fillRect()
填充实心矩形,操作完成后调用dispose()
释放资源,最后保存图像文件。Java在图片上绘制矩形的完整指南
在Java中为图片添加矩形标记是一项非常实用的技能,广泛应用于图片标注、图像处理、生成水印等场景,本文将详细介绍三种常用方法实现这一功能,并附带完整可运行的代码示例。
核心实现方法
方法1:使用Java原生Graphics2D
这是最基础也是最常用的方法,通过Java内置的图形处理库实现:
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class RectangleDrawerBasic { public static void main(String[] args) throws Exception { // 1. 读取原始图片 BufferedImage image = ImageIO.read(new File("input.jpg")); // 2. 创建Graphics2D对象 Graphics2D g2d = image.createGraphics(); // 3. 设置绘制属性 g2d.setStroke(new BasicStroke(3)); // 3像素边框粗细 g2d.setColor(Color.RED); // 红色矩形 // 4. 绘制矩形 (x, y, width, height) int x = 100, y = 150; // 左上角坐标 int width = 300, height = 200; // 矩形尺寸 g2d.drawRect(x, y, width, height); // 5. 释放资源并保存 g2d.dispose(); ImageIO.write(image, "jpg", new File("output_basic.jpg")); System.out.println("矩形绘制完成"); } }
方法2:添加半透明填充效果
需要更丰富的视觉效果时,可设置透明填充:
// 在Graphics2D代码基础上添加: g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); g2d.setColor(new Color(0, 255, 0, 100)); // 带透明度的绿色 g2d.fillRect(x, y, width, height); // 填充矩形
方法3:使用Thumbnator库(简化操作)
对于需要快速实现的情况,可以使用第三方库:
import net.coobird.thumbnailator.Thumbnails; import net.coobird.thumbnailator.geometry.Positions; import java.io.File; public class ThumbnailatorExample { public static void main(String[] args) throws Exception { Thumbnails.of("input.jpg") .size(800, 600) .watermark(Positions.BOTTOM_RIGHT, new Color(255,0,0,128), // 半透明红色 10) // 边框粗细 .addFilter(new Watermark(Rectangle.class, new Point(100, 150), new Dimension(300, 200))) .toFile("output_thumbnail.jpg"); } }
关键参数详解
参数 | 说明 | 示例值 |
---|---|---|
位置坐标(x,y) | 矩形左上角位置 | (100, 150) |
尺寸(width,height) | 矩形宽高 | (300, 200) |
颜色(Color) | 支持RGB/HEX/预设颜色 | Color.RED / #FF0000 |
边框粗细 | 线条像素宽度 | new BasicStroke(3) |
透明度 | 0(完全透明)-1(不透明) | 5f |
高级技巧
绘制圆角矩形
int arcWidth = 20, arcHeight = 20; // 圆角弧度 g2d.drawRoundRect(x, y, width, height, arcWidth, arcHeight);
添加文字标注
g2d.setFont(new Font("Arial", Font.BOLD, 18)); g2d.drawString("检测目标", x, y-5);
多矩形同时绘制
List<Rectangle> rects = Arrays.asList( new Rectangle(100, 150, 300, 200), new Rectangle(400, 300, 150, 250) ); for(Rectangle rect : rects) { g2d.drawRect(rect.x, rect.y, rect.width, rect.height); }
常见问题解决方案
-
图片格式问题:
- 使用
ImageIO.write(image, "PNG", file)
保存为PNG格式可避免JPEG压缩导致的失真 - 支持格式:JPG、PNG、BMP
- 使用
-
矩形位置偏移:
- 确保坐标系统原点(0,0)在图片左上角
- 超出图片范围的坐标会被自动裁剪
-
性能优化:
- 对于批量处理,使用
BufferedImage.TYPE_INT_RGB
替代TYPE_BYTE_INDEXED - 重复使用Graphics2D对象减少创建开销
- 对于批量处理,使用
应用场景实例
// 人脸检测标注示例 public void markFaces(BufferedImage image, List<FaceDetectionResult> faces) { Graphics2D g2d = image.createGraphics(); g2d.setStroke(new BasicStroke(2)); for (FaceDetectionResult face : faces) { // 绘制人脸矩形 g2d.setColor(new Color(255, 100, 100, 200)); g2d.drawRect(face.getX(), face.getY(), face.getWidth(), face.getHeight()); // 添加置信度文本 g2d.setColor(Color.WHITE); g2d.drawString(String.format("%.2f", face.getConfidence()), face.getX(), face.getY()-5); } g2d.dispose(); }
最佳实践建议:对于生产环境应用,建议:
- 添加异常处理(
IIOException
)- 使用try-with-resources管理文件资源
- 对用户输入坐标进行范围校验
- 考虑使用双缓冲技术防止闪烁
完整可运行示例
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; public class CompleteRectangleExample { public static void main(String[] args) { try { // 1. 加载图片 BufferedImage original = ImageIO.read(new File("input.jpg")); // 2. 创建副本用于编辑 BufferedImage image = new BufferedImage( original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_RGB ); Graphics2D g = image.createGraphics(); g.drawImage(original, 0, 0, null); // 3. 绘制主矩形(红色边框) g.setColor(Color.RED); g.setStroke(new BasicStroke(3)); g.drawRect(50, 75, 200, 150); // 4. 绘制半透明填充矩形(绿色) g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); g.setColor(Color.GREEN); g.fillRect(300, 200, 180, 220); // 5. 绘制圆角矩形(蓝色) g.setComposite(AlphaComposite.SrcOver); g.setColor(Color.BLUE); g.setStroke(new BasicStroke(2)); g.drawRoundRect(150, 300, 250, 100, 25, 25); // 6. 添加文字标注 g.setFont(new Font("微软雅黑", Font.BOLD, 20)); g.setColor(Color.ORANGE); g.drawString("重要区域", 160, 290); // 7. 保存结果 g.dispose(); ImageIO.write(image, "jpg", new File("output.jpg")); System.out.println("图片处理完成,已保存为output.jpg"); } catch (Exception e) { System.err.println("处理失败: " + e.getMessage()); e.printStackTrace(); } } }
运行此代码将生成包含三种矩形(普通矩形、透明填充矩形、圆角矩形)的图片,适合大多数应用场景。
在Java中绘制矩形到图片上主要依赖Graphics2D
类的绘图功能,关键步骤包括:
- 通过
ImageIO.read()
加载图片 - 使用
createGraphics()
获取图形上下文 - 设置绘制属性(颜色、线条、透明度)
- 调用
drawRect()
或fillRect()
方法 - 使用
dispose()
释放资源 - 通过
ImageIO.write()
保存结果
掌握这些技术后,您可以根据需求扩展实现更复杂的图像标注功能,如多目标标记、动态区域标识、自动标注系统等。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/8054.html