【问题标题】:Where does the origin of a graphic string start?图形字符串的起源从哪里开始?
【发布时间】:2012-02-28 10:35:24
【问题描述】:

在核心 Java 书中它说

getStringBounds 方法返回的矩形的宽度是水平 字符串的范围。矩形的高度是上升、下降和下降的总和 领导。矩形的原点位于字符串的基线。矩形的顶部 y 坐标为负数。因此,您可以获得字符串的宽度、高度和 上升如下:

double stringWidth = bounds.getWidth();
double stringHeight = bounds.getHeight();
double ascent = -bounds.getY();

作者说矩形的原点在字符串的基线,而顶部 y 坐标是上升是什么意思?

字符串的边界矩形从哪里开始?

使用测试字符串,我得到以下信息:

w: 291.0
h: 91.265625
x:0.0
y:-72.38671875
descent: 15.8203125
leading: 3.0585938

这意味着矩形原点位于前导而不是基线,我对此是否正确?

【问题讨论】:

  • 为什么你认为起源是领先的?
  • 通过添加 y+h=(descent+leading) 哪个领先开始的点,我假设原点位于底部左侧
  • 另见answer比较FontMetrics.stringWidth()TextLayout#getBounds()
  • @trashgod TextLayout! Gads .. 那是我一直忘记的 FontMetricsGlyphVectorJLabelTextLayout。 Java 提供了无数种方法来给这个cat 换肤。

标签: java swing graphics awt java-2d


【解决方案1】:

这意味着边界的坐标在一个空间中,其中零 Y 坐标位于字符串的基线,正 Y 坐标向下。在下图中,黑点对应于零 Y:

因此负数bounds.getY()(上升)对应于最高坐标。而正的bounds.getHeight() + bounds.getY()(下降+前导)将对应这个坐标空间中的最底部坐标。

【讨论】:

【解决方案2】:

数学计算出来了:

72.38671875 上升 + 15.8203125 下降 + 3.0585938 领先 = 91.265625 总高度

This tutorial on 2D Text 有一张图片说明领先、下降和上升。

在您的具体情况下,72.38671875 是上升的高度。这是从基线到最高字形顶部的测量值。前导是下降器底部到下一行顶部之间的空间。

边界矩形是相对于基线的。 FontMetrics.getStringBounds 的 API 声明“返回的边界在基线相对坐标中”,这解释了您的结果。 x 将始终为 0,边界框的高度将是上升加下降加前导。

【讨论】:

  • 感谢您的回答,我现在清楚了,基线位于 (0,0) 坐标,边界矩形相对于该坐标。
【解决方案3】:

Java 图形坐标系的原点位于画布的右上角,Y 坐标从上到下递增。这意味着矩形的上边缘(getY() 的返回值)的 Y 坐标将比其下边缘(文本字符串的基线)

getStringBounds() 的结果值只是与此有些一致。在尊重坐标系的同时,边界矩形的原点相对于基线,而不是左上角。这意味着矩形的左上角将有一个负 Y 坐标。

【讨论】:

  • 不是底部,而是基线。编辑:API 使用术语 baseline-relative
  • @trashgod “左下角”是一种直观的描述,而不是字面的描述。我将对其进行编辑以使其更清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多