问题标签 [fontmetrics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
83 浏览

java - Java 2D PNG:计算尺寸

我想用 Java 创建一个 PNG 图像。在这张图片中,我想显示一些随机文本。Normaly 我会创建这样的图片:

我知道我可以使用以下代码计算字符串长度:

但要执行此操作,我需要一个图形对象(我从 BufferedImage 中获取)。所以我必须先声明 BufferedImage,然后才能使用 stringWidth。

结果是,图像比需要的大得多。

我看到的唯一方法是创建一个“虚拟 BufferedImage”。所以我可以计算所需的宽度和高度,然后我可以创建一个适合的 BufferedImage。

我找不到更好的解决方案,但也许有人可以帮助我。

非常感谢。

0 投票
0 回答
123 浏览

java - 在Java中计算行长

我一直在使用 LineBreakMeasurer & AttributedString 来测量线的长度。但是,我现在需要考虑:

  1. 小帽子
  2. 缩放(使每个字符更薄/更宽)。
  3. 间距(在每个字符后添加/减去空格)。
  4. 断字,在单词中的特定位置可以出现换行符。

有没有办法使用Java做到这一点?我需要得到的两个基本的东西是:

  1. 传入的字符串有多长。
  2. 对于传入的字符串和长度,字符串中有多少个字符适合该长度。

我可以使用 LineBreakMeasurer & AttributedString 并逐个字符地调用它。但是有更好的方法吗?

谢谢 - 戴夫

0 投票
3 回答
1370 浏览

java - 获取 FontMetrics StackOverflowError

运行以下代码:

产生此错误:

线程“主”java.lang.StackOverflowError 中的异常

在 java.awt.FontMetrics.getWidths(FontMetrics.java:430)

在 java.awt.FontMetrics.charWidth(FontMetrics.java:333)

在 java.awt.FontMetrics.getWidths(FontMetrics.java:430)

在 java.awt.FontMetrics.charWidth(FontMetrics.java:333)

在 java.awt.FontMetrics.getWidths(FontMetrics.java:430)

等等....

为什么?

0 投票
1 回答
192 浏览

android - FontMetrics 的领先似乎总是返回零?

我试过这段代码:

但似乎领先总是0。我在 about 中阅读了文档leading

建议在文本行之间添加的额外空间。

但我不知道这是什么意思。任何人都可以帮助我理解它的含义吗?任何图像都可以提供更好的帮助。

0 投票
3 回答
2241 浏览

android - 如何获取 TextView 的行距?

有没有办法获得 a TextViewin的行距Android?我试图找到fontMetricsPaintTextView这样做:

但似乎结果是相同的,直到我更改TextView. 那么如何获得 a 的行距TextView

0 投票
0 回答
560 浏览

java - Java中损坏的字体度量的可能原因/解决方法列表?还是我必须切换到 LaTeX?

我正在开发一个我认为相当简单/直接的应用程序。它所做的只是将字符串呈现为BufferedImage特定字体的 a (来自文件,未安装在系统上)。我正在取得一些进展,但经过几天的努力,Java 似乎对字体指标非常善变。有时它喜欢提供良好的字体度量,有时它喜欢返回全零和全 240 的某种组合(无论字体大小),但没有明显的原因。

在少数情况下,我发现仅调用f = f.deriveFont(myFloat)会导致字体度量完全失败,从有效数字变为全零,而调用f = f.deriveFont(Font.PLAIN, (int) myInt)会保留度量,因此新字体实例可以正常工作。(是的,我知道这应该是一个浮点数,但由于某种原因,用浮点数调用它在某些情况下会再次破坏字体指标。)

通过TextAttributes在字体和对象RenderingHints中的组合Graphics2D,我设法让大多数字体工作......但我仍然有少数OpenType字体(.otf)在 Java 中破坏了指标(JSE/JDK 7 ) 虽然它们在Windows 7字体查看器中显示良好。

因此,我选择了其中一种字体,并删除了应用程序中的所有内容,只在 Main 方法中获得了最原始的字体视图。这段代码中的echo()方法只是System.out.println(). (另外,我很抱歉这段代码的草率——我只是把我能找到的任何可能在这一点上产生新信息的东西都扔进去。)

此代码的输出如下所示:

显然有可能从这个字体进来的 .otf 文件中获得正确的字体指标,因为 Windows 7 字体查看器和另一个用 C 编写的应用程序能够将它呈现到 PNG 上,就像我在这里尝试做的那样,我只是可以'不知道为什么 Java 不喜欢它。

  • 它不是抛出 anIOException或 a FontFormatException,所以我知道它正在读取文件并创建一个表面上有效的Font 对象。
  • 在上面的代码中,我GlyphVector使用一个 int 数组创建了一个 int 数组,它是GlyphCodes从 1 到字体中字形数(在本例中为 33)的索引,因此它不必搜索 从Unicode CodePoints转换为的CMAP字形并可能找不到这些字符。
  • 您还可以在FontMetricsFont 报告的大小为 20pts 的回声中看到,所以它不像被设置为 size=0 或任何东西。无论我在字体上设置什么大小,输出中的 240 都不会改变。

经过几天尝试为 Google 提供搜索词后,我仍然找不到有关此特定问题的信息。看起来真的很奇怪。你会认为字体指标看似随机地左右打破(尽管我确信它实际上不是随机的)会是人们会问他们是否有这个问题,特别是考虑到我测试过的所有字体似乎始终报告零和 240 的组合。后半部分,他们都一致报告 240 秒,对于一个不容易通过谷歌搜索的问题,这似乎有点奇怪。

无论如何,我想知道是否有人有可能导致 Java 中字体指标错误的项目列表(文本属性、图形设置、JRE 标志、操作系统环境变量、字体创建程序、字体文件中的标志等)?或者可能是损坏字体指标的解决方法列表?还是Java中的字体很糟糕,我应该研究一下LaTeX?(老实说,我目前对此一无所知。)

谢谢!

编辑:嗯......这有点令人沮丧......我想也许如果我挖掘 OpenJDK 的“开源”,也许我可以产生一个Font可以解决这些指标问题的派生实现......但显然这是通过将所有必要的内部结构设为私有、静态和最终的来故意防止。请参阅:字体,如何扩展它们......我无法在运行时替换核心类 - 请参阅:替换 java 类?...因此,如果我想尝试以这种方式修复指标,唯一的选择是使用 , 等的完整副本重新创建整个 Java 字体体系结构,java.awt.Font然后手动将sun.font.Font2D字形绘制到对象上,因为没有它就无法工作或衍生物Graphics2DGraphics.drawGlyphVector()Graphics.drawString()FontFont因为他们使用Font类作为参数,Graphics.setFont()而不是为 Font 声明一个接口来实现。...除非我误读了第二个堆栈溢出参考的答案?我误读了吗?我可以创建一个自定义类加载器,Font用修改后的版本替换该类吗?

编辑:也许我应该在发布最后一次编辑之前做更多的研究,但是对于任何正在阅读这个问题并想知道的人,是的,您可以用 JVM 参数替换核心 Java 类的修改版本。请参阅: http: //media.techtarget.com/tss/static/articles/content/CovertJava/Sams-CovertJava-15.pdf所以我现在正在做的是挖掘大量核心类来尝试找到这个地方其中度量是从字体文件中读取的。如果我能找到,那么我可以用修改后的版本替换该类,以纠正损坏的指标。

0 投票
1 回答
450 浏览

graphics2d - 如何获取字符的真实高度(fontmetrics/graphics2d)

我目前需要得到一个角色的真实身高。我知道 getDecsent()、getAscent()、...等函数,但它们只允许获取有关孔字体的值(在其上下文中)。我也尝试了使用 getStringBounds() 的方式,但这是同一个故事。

正如标题所说,我正在寻找一种方法来一次只获取一个字符的高度值。

例如'N'比'n'高,'I'比'i'高一点等等

谢谢你的时间

0 投票
1 回答
162 浏览

java - Java:图形对齐字符串

我目前正在尝试创建一个滚动文本方法,其中将采用String. 很快,它将开始从左到右绘制,并随着时间的推移进入新的行,因此它不会从屏幕上绘制出来。我正在使用FontMetrics来尝试实现我的目标。

RollingText.render(Graphics g, int x, int y)从我的主类中的渲染方法将参数传递给我。在我的render方法中,我开始设置Graphics字体和颜色,并抓取所有 . FontMetrics,然后我开始从FontMetrics. 同样,我进入一个用于将文本绘制到字符串的 for 循环。

目前,此时一切都会正常工作,但留下的问题是drawString方法中每个单词之间的空格被严重夸大了,如下所示:

滚动文本演示

该行:

我目前遇到的唯一问题是找到正确的方法来计算 x 位置。目前,它的间距很大且动态取决于字长,我无法弄清楚如何让它看起来至少正常。我用我当前定义的整数尝试了不同的组合,等等。出现的问题包括不正确的间距、不恰当的定位和闪烁,以及一起运行的文本。

最后,我的问题是,将使用哪种算法来帮助我正确定位 x 坐标以使文本看起来正确?

0 投票
1 回答
492 浏览

java - Java:.ttf 字体为空,宽度 <=0,系统字体工作

我正在尝试生成bufferedImage给定文本大小的 a 。使用系统字体时,没有问题。我三次检查了位置,所以这不应该是我的错误。如果需要,我可以在某处上传字体。

使用 .ttf 文件时出现错误,表明其中没有数据。

错误说:


示例代码:

0 投票
2 回答
1621 浏览

java - 为什么只有拉丁字符的 Java 字体声称支持亚洲字符,即使它不支持?

使用 JFreeChart 渲染图表时,当图表的类别标签包含日文字符时,我注意到布局问题。尽管文本以正确的字形呈现,但文本被放置在错误的位置,可能是因为字体度量错误。

该图表最初配置为对该文本使用Source Sans Pro Regular字体,该字体仅支持拉丁字符集。显而易见的解决方案是捆绑一个实际的日文 .TTF 字体并让 JFreeChart 使用它。这很好用,因为输出文本使用正确的字形并且布局也正确。

我的问题

  • java.awt 是如何在第一个场景中正确渲染日文字符的,当使用的源字体实际上不支持除拉丁字符之外的任何内容时?如果重要的话,我正在使用 JDK 1.7u45 在 OS X 10.9 上进行测试。

  • 有没有办法在不捆绑单独的日文字体的情况下呈现日文字符?(这是我的最终目标!)虽然捆绑解决方案有效,但如果可以避免的话,我不想在我的应用程序中增加 6 Mb 的膨胀。即使没有字体(至少在我的本地环境中),Java 也清楚地知道如何以某种方式呈现日文字形——这似乎只是被破坏的指标。我想知道这是否与下面的“frankenfont”问题有关。

  • 在 JRE 执行内部转换之后,为什么 Source Sans Pro 字体告诉调用者(通过canDisplayUpTo())它可以显示日语字符,即使它不能?(见下文。)

编辑澄清:

  • 这是一个服务器应用程序,我们正在渲染的文本将显示在客户端的浏览器和/或 PDF 导出中。图表始终在服务器上栅格化为 PNG。

  • 我无法控制服务器操作系统或环境,尽管使用 Java 标准平台字体会很好,但许多平台的字体选择很差,在我的用例中是不可接受的,所以我需要捆绑我自己的(在至少对于拉丁字体)。对日文文本使用平台字体是可以接受的。

  • 该应用程序可能会被要求显示日语和拉丁语文本的混合,而无需事先了解文本类型。如果字符串包含混合语言,只要字形正确呈现,我对使用什么字体感到矛盾。

细节

我知道 java.awt.Font#TextLayout 很聪明,并且在尝试布局文本时,它首先询问底层字体是否可以实际呈现提供的字符。如果不是,它可能会换成一种知道如何渲染这些字符的不同字体,但这不会发生在这里,基于我对 JRE 类的调试很远。TextLayout#singleFont总是为字体返回一个非空值,并通过fastInit()构造函数的一部分进行。

一个非常奇怪的注意事项是,Source Sans Pro 字体以某种方式被强制告诉调用者它确实知道在 JRE 对字体执行转换后如何渲染日文字符。

例如:

这个的输出是:

请注意,上面提到的三行“魔术操纵”不是我自己做的;我们将真正的源字体对象传递给 JFreeChart,但在绘制字形时它会被 JRE 修改,这就是上面三行“魔术操作”代码所复制的内容。上面显示的操作与以下调用序列中发生的操作在功能上等价:

  1. org.jfree.text.TextUtilities#drawRotatedString
  2. sun.java2d.SunGraphics2D#drawString
  3. java.awt.font.TextLayout#(构造函数)
  4. java.awt.font.TextLayout#singleFont

当我们在“魔术”操作的最后一行调用 Font.getFont() 时,我们仍然得到一个 Source Sans Pro 字体,但底层字体的font2D字段与原始字体不同,这个单一字体现在声称它知道如何渲染整个字符串。为什么?看起来 Java 给了我们某种“frankenfont”,它知道如何渲染各种字形,即使它只理解底层源字体中提供的字形的度量。

此处是显示 JFreeChart 渲染示例的更完整示例,基于 JFreeChart 示例之一:https ://gist.github.com/sdudley/b710fd384e495e7f1439此示例的输出如下所示。

Source Sans Pro 字体示例(布局不正确):

在此处输入图像描述

IPA 日文字体示例(布局正确):

在此处输入图像描述