在Java中实现图片上添加文字是一项常见的图像处理需求,广泛应用于生成海报、验证码、带水印图片等场景,这一过程主要依赖Java AWT(Abstract Window Toolkit)和ImageIO工具包,通过操作Graphics2D绘图上下文完成文字渲染,以下从基础工具、实现步骤、进阶技巧等方面详细解析具体方法。

基础工具准备
实现图片文字绘制需先了解核心类:
- BufferedImage:用于表示内存中的图像,支持不同颜色模型(如RGB、ARGB),是操作图片的基础载体。
- Graphics2D:继承自Graphics,提供更丰富的绘图功能,包括文字渲染、图形绘制等,是文字绘制的“画笔”。
- Font:定义文字样式(字体、大小、粗细等),需通过
Font.createFont()加载系统字体或自定义字体文件。 - Color:设置文字颜色,支持RGB、ARGB等颜色模式,透明度可通过
new Color(r, g, b, alpha)控制。
核心实现步骤
加载目标图片
使用ImageIO.read()方法读取本地图片或网络图片,返回BufferedImage对象,需处理IOException,
BufferedImage image = ImageIO.read(new File("input.jpg")); // 加载本地图片
获取绘图上下文
通过BufferedImage.createGraphics()获取Graphics2D对象,该对象用于后续的文字绘制和样式设置。
设置文字样式
创建Font对象并设置字体属性,再通过Graphics2D.setFont()应用字体,例如加载系统字体“宋体”,大小20:

Font font = new Font("宋体", Font.BOLD, 20); // 字体样式、大小
graphics2D.setFont(font);
若需使用自定义字体(如.ttf文件),需先加载字体文件:
Font customFont = Font.createFont(Font.TRUETYPE_FONT, new File("font.ttf")).deriveFont(20f);
graphics2D.setFont(customFont);
设置文字颜色与渲染属性
通过Graphics2D.setColor()设置文字颜色,setRenderingHint()优化文字渲染质量(如抗锯齿):
graphics2D.setColor(Color.RED); // 红色文字 graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 开启抗锯齿
绘制文字
调用Graphics2D.drawString(String str, int x, int y)方法绘制文字,参数分别为文字内容和起始坐标(x为文字左下角横坐标,y为文字基线纵坐标),例如在图片中心绘制文字:
String text = "Java文字示例"; FontMetrics fontMetrics = graphics2D.getFontMetrics(); // 获取字体 metrics int textWidth = fontMetrics.stringWidth(text); // 文字宽度 int textHeight = fontMetrics.getHeight(); // 文字高度 int x = (image.getWidth() - textWidth) / 2; // 居中横坐标 int y = (image.getHeight() - textHeight) / 2 + fontMetrics.getAscent(); // 居中纵坐标(基线位置) graphics2D.drawString(text, x, y);
释放资源与保存图片
绘制完成后,需调用Graphics2D.dispose()释放绘图资源,避免内存泄漏,使用ImageIO.write()将处理后的图片保存到文件,支持JPEG、PNG等格式:

graphics2D.dispose(); // 释放资源
ImageIO.write(image, "PNG", new File("output.png")); // 保存为PNG格式
进阶技巧优化
文字位置精确控制
- 基线调整:
drawString()的y坐标是文字基线位置,若需文字整体居中,需通过FontMetrics.getAscent()( ascent为基线到字符顶部的距离)和FontMetrics.getDescent()( descent为基线到字符底部的距离)计算实际高度。 - 角度旋转:通过
Graphics2D.rotate(angle, x, y)实现文字旋转,需先保存原始绘图状态(graphics2D.save()),旋转后再恢复(graphics2D.restore()):graphics2D.save(); // 保存状态 graphics2D.translate(x, y); // 移动到旋转中心 graphics2D.rotate(Math.toRadians(45)); // 旋转45度 graphics2D.drawString("旋转文字", 0, 0); // 绘制(此时坐标为旋转后的局部坐标) graphics2D.restore(); // 恢复状态
多行文字处理
通过String.split("\\n")分割多行文字,循环绘制并调整y坐标:
String[] lines = text.split("\\n");
int lineHeight = fontMetrics.getHeight();
for (int i = 0; i < lines.length; i++) {
int y = startY + i * lineHeight;
graphics2D.drawString(lines[i], x, y);
}
文字描边与阴影
- 描边:通过
Graphics2D.setStroke()设置线条样式,draw()绘制文字轮廓:graphics2D.setColor(Color.BLACK); // 描边颜色 graphics2D.setStroke(new BasicStroke(1f)); // 描边宽度 graphics2D.draw(text); // 绘制文字轮廓
- 阴影:通过偏移坐标多次绘制文字,模拟阴影效果:
graphics2D.setColor(new Color(0, 0, 0, 50)); // 半透明阴影 graphics2D.drawString(text, x + 2, y + 2); // 偏移绘制阴影 graphics2D.setColor(Color.RED); // 原色文字 graphics2D.drawString(text, x, y); // 正常绘制
注意事项与小编总结
- 资源释放:
Graphics2D对象需手动调用dispose()释放,否则可能导致内存泄漏。 - 字体兼容性:不同系统可能缺少特定字体,建议使用通用字体(如“宋体”“Arial”)或嵌入自定义字体文件。
- 图片格式支持:JPEG格式不支持透明度,若需透明背景需使用PNG格式。
通过以上步骤和技巧,可灵活实现Java中图片文字的绘制,满足不同场景的需求,核心在于掌握Graphics2D的绘图方法和FontMetrics的尺寸计算,结合实际需求调整样式和位置即可高效完成开发。


















