在Java开发中,为图片添加文字是一项常见需求,广泛应用于海报生成、图片水印、证件照信息标注等场景,实现这一功能主要依赖Java AWT(Abstract Window Toolkit)和Java 2D API,通过Graphics2D类进行绘图操作,本文将从基础实现到样式调整,逐步介绍Java在图片上添加文字的具体方法。

基础实现:创建画布并绘制文字
在Java中,图片的本质是一个像素矩阵,而添加文字的核心思路是:将图片作为“画布”,使用Graphics2D工具在画布上绘制文字内容,以下是基础步骤:
-
加载或创建图片
使用BufferedImage类创建图片对象,或通过ImageIO读取本地图片文件,创建一个800×600像素的白色背景图片:BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); // 填充背景色(可选) g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, 800, 600);
-
设置文字样式
通过Font类定义文字的字体、大小和样式(如粗体、斜体),设置36号黑体粗体字:Font font = new Font("黑体", Font.BOLD, 36); g2d.setFont(font); g2d.setColor(Color.BLACK); // 设置文字颜色 -
绘制文字
使用drawString()方法在指定坐标绘制文字,注意:坐标原点(0,0)位于图片左上角,x轴向右为正,y轴向下为正:g2d.drawString("Java图片文字添加示例", 100, 100); -
释放资源并保存图片
绘制完成后,需调用g2d.dispose()释放Graphics2D资源,并通过ImageIO保存图片:
g2d.dispose(); ImageIO.write(image, "jpg", new File("output.jpg"));
文字样式调整:字体、颜色与旋转
实际应用中,常需调整文字的字体、颜色、大小、旋转角度等样式,以满足不同场景需求。
-
字体与颜色
- 自定义字体:若系统未安装目标字体(如“华文行楷”),可通过
Font.createFont()加载外部字体文件(.ttf/.otf):InputStream fontStream = new FileInputStream("STXINGKA.TTF"); Font customFont = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(30f); g2d.setFont(customFont); - 颜色设置:
Color类支持RGB、ARGB格式,例如设置半透明红色:g2d.setColor(new Color(255, 0, 0, 128)); // ARGB,128为透明度(0-255)
- 自定义字体:若系统未安装目标字体(如“华文行楷”),可通过
-
文字旋转与对齐
- 旋转文字:通过
Graphics2D.rotate()方法实现旋转,需注意旋转中心坐标和弧度转换(Math.toRadians()将角度转为弧度):g2d.rotate(Math.toRadians(30), 200, 200); // 以(200,200)为中心旋转30度 g2d.drawString("旋转文字", 200, 200); - 文字对齐:默认文字基线在左侧,可通过
FontMetrics调整对齐方式,例如实现文字居中:FontMetrics fm = g2d.getFontMetrics(); String text = "居中文字"; int x = (image.getWidth() - fm.stringWidth(text)) / 2; int y = (image.getHeight() - fm.getHeight()) / 2 + fm.getAscent(); g2d.drawString(text, x, y);
- 旋转文字:通过
复杂场景处理:多行文字与透明度
当需求涉及多行文字、图片水印或透明叠加时,需结合字符串分割和透明度控制实现。
-
多行文字绘制
通过split()方法按换行符分割字符串,循环绘制每行文字,并控制行间距:
String text = "第一行文字\n第二行文字\n第三行文字"; String[] lines = text.split("\n"); int y = 100; // 起始y坐标 for (String line : lines) { g2d.drawString(line, 100, y); y += 40; // 行间距(字体大小+10) } -
透明水印与叠加
使用AlphaComposite设置透明度,实现水印效果,在图片右下角添加半透明水印:g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f)); // 30%透明度 g2d.setFont(new Font("微软雅黑", Font.PLAIN, 20)); g2d.setColor(Color.GRAY); String watermark = "© 2026 示例水印"; int x = image.getWidth() - g2d.getFontMetrics().stringWidth(watermark) - 20; int y = image.getHeight() - 20; g2d.drawString(watermark, x, y);
注意事项与异常处理
- 资源释放:Graphics2D对象使用后必须调用
dispose(),否则可能导致内存泄漏。 - 字体兼容性:自定义字体需确保目标环境可访问(如将字体文件打包到项目中),或使用系统通用字体(如“宋体”“Arial”)。
- 图片格式支持:
ImageIO支持常见格式(JPG、PNG、GIF等),但JPEG不支持透明通道,若需透明背景需选择PNG。 - 异常处理:文件读写(
ImageIO.write)和字体加载(createFont)可能抛出异常,需用try-catch包裹,try { ImageIO.write(image, "png", new File("output.png")); } catch (IOException e) { e.printStackTrace(); }
通过以上步骤,可灵活实现Java中图片文字添加的基础功能与复杂样式调整,核心在于理解Graphics2D的绘图机制,结合字体、颜色、透明度等属性控制,最终满足多样化的图片处理需求。















