Java graphics drawString x,y绘图位置偏差问题解决

编程教程 > Java (74) 2025-06-11 13:29:01

问题描述

在Java绘制图片/画图/添加文字水印等文字内容时候,总感觉y轴有一定的偏差,导致与预期效果不一致,尤其是生产证书类型业务,对不准很影响观感。

drawString源码剖析

首先上graphics.drawString方法的源码解释

    /**
     * Draws the text given by the specified string, using this
     * graphics context's current font and color. The baseline of the
     * leftmost character is at position (<i>x</i>,&nbsp;<i>y</i>) in this
     * graphics context's coordinate system.
     * @param       str      the string to be drawn.
     * @param       x        the <i>x</i> coordinate.
     * @param       y        the <i>y</i> coordinate.
     * @throws NullPointerException if {@code str} is {@code null}.
     * @see         java.awt.Graphics#drawBytes
     * @see         java.awt.Graphics#drawChars
     */
    public abstract void drawString(String str, int x, int y);
Java graphics drawString y位置偏差问题解决_图示-9155a57a046f485bacd631c36483fea4.png

指定字符串和坐标即可。

但是简单认为字符串的起始位置就是左上顶点就错了,这样画起来每次的位置都不对,字体的大小不同,位置偏差很大。仔细看api注释后发现,y坐标是字符串基线位置的坐标,也就是说字符串基线与画布y重合。

字体的高由个元素组成:

  • ascent
  • descent

drawString中用的y坐标是指baseline的y坐标,即字体所在矩形的左上角 y坐标+ascent

Java graphics drawString y位置偏差问题解决_图示-a04bda3cf6174644988923a8a42bc43f.png

解决y轴定位偏差问题

代码示例

BufferedImage srcBi = ImageIO.read("c:/1.jpg");

int owidth = srcBi.getWidth();
int oheight = srcBi.getHeight();

Graphics2D graphics = (Graphics2D)srcBi.getGraphics();
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics.setColor(Color.BLUE);
int fontSize = 50;
Font font = new Font("楷体",Font.BOLD,fontSize);
//jdk 17
FontMetrics fontMetrics = graphics.getFontMetrics(font);
//jdk8
//FontDesignMetrics fontMetrics = FontDesignMetrics.getMetrics(font);
graphics.setFont(font);
int ascent = fontMetrics.getAscent();

//画字符串,x坐标即字符串左边位置,y坐标是指baseline的y坐标,即字体所在矩形的左上角y坐标+ascent
//基线对齐改为顶边对齐
改进前代码:
//graphics.drawString(DateUtil.formatDate(new java.util.Date(),DateUtil.FULL_TRADITION_PATTERN),10,10); 
//改进后
graphics.drawString(DateUtil.formatDate(new java.util.Date(),DateUtil.FULL_TRADITION_PATTERN),10,10+ascent); 

 

解决x周定位偏差导致居中问题

代码示例

String centerWords = "居中文字";
int strWidth = fontMetrics.stringWidth(centerWords);
int strHeight = fontMetrics.getHeight();
//左边位置
int left = (owidth-strWidth)/2; 
//顶边位置+上升距离(原本字体基线位置对准画布的y坐标导致字体偏上ascent距离,加上ascent后下移刚好顶边吻合)
int top = (oheight-strHeight)/2+fontMetrics.getAscent(); 
graphics.drawString(centerWords,left,top);

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
问题描述在Java绘制图片/画图/添加文字水印等文字内容时候,总感觉y轴有一定的偏差,导致与预期效果不一致,尤其是生产证书类型业务,对不准很影响观感。drawS
问题描述JavaFX maven项目在idea中启动报错:Exception in thread "WindowsNativeRunloopThread" java.lang.NoSuchMet...
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
BorderLayout 边框布局管理器BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局
在Swing中,任何其他组件都必须位于一个顶层容器中。JFrame 窗口和 JPanel 面板是常用的顶层容器,本节详细介绍这两个容器的使用方法。JFrame
1.使用idea创建JavaFX项目idea创建JavaFX项目创建后运行尝试:运行结果 可以看到目前是能正常运行 Hello Word项目的,这个时候还没有maven支持
最近在学习JavaFX,发现资料很少,连基本的图片读取都很多错误版本
问题描述最近写JavaFX程序遇到了下面的错误:Exception in thread "pool-2-thread-1" java.lang.IllegalStateException: No...
创建maven项目添加依赖方便开发,添加一些开发工具依赖,比如 lombok Swing UI开发创建Hello UI在src/main/java/包名下有件菜
Java图片等比缩放 //重置大小(太宽没啥用)最大支持1.5倍图(1150*1.5) int maxWidth=(int)(920*1.5); //大小重置
thymeleaf 设置不校验html标签
SSH/SSM项目中如何集成thymeleaf?本文将讲解SSH/SSM项目中如何集成thymeleaf模板引擎
Thymeleaf 递归,Thymeleaf模板引擎递归展示如评论留言等场合适用
springboot 使用thymeleaf 模板引擎中url中的&引起的org.xml.sax.SAXParseException: 对实体 "uid" 的引用必须以 ';' 分隔符结尾。问题解决