有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Graphics2D绘制的文本精确导出到SVG

我正在尝试将文本导出到SVG文件,并使其看起来类似于使用java Graphics2D绘制的内容。精度对于我的应用程序至关重要,这意味着Java和SVG中的文本都需要对齐。SVG和Graphics2D文本都有相同的字体(系列、样式、大小),我可以肯定地看到生成的文本是不同的

示例:字符看起来相同,但由于某些原因,“T”和“e”之间的间距不同

黑色-SVG文本

蓝色-Java绘制的文本

使用图形绘制文本的代码2d

Graphics2D g2 = (Graphics2D) g;

String text = "Test";
Font font = new Font("Arial", Font.PLAIN, 33);
g.setFont(getTextFont());
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

g.drawString("Test", 0.f, 0.f);

SVG文本

<text fill="rgb(0,115,198)" font-family="Arial" font-size="33.0">
  <tspan dy="0" x="0">Test</tspan>
</text>

Test Top From SVG; Test Bottom From Graphics2D

enter image description here

你知道如何更改SVG(在Adobe中查看)或Java文本以使它们显示完全相同的内容吗

更新:

转动字距确实会使它更像是一种补色,但并不完美

示例:f和A之间的间距似乎不同。但剩下的文字排成一行

代码

public void draw() {
    Graphics2D g2 = (Graphics2D) g;

    String text = "Test";
    Font font = new Font("Arial", Font.PLAIN, 33);
    Map<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
    map.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
    font = font.deriveFont(map);
    g.setFont(font);
    g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

    g.draw(getTextShapeByLine(text);
}

public Shape getTextShapeByLine(String line) {
    AttributedString attstring = new AttributedString(line);
    attstring.addAttribute(TextAttribute.FONT, getTextFont());
    FontRenderContext frc = new FontRenderContext(null, true, true);
    TextLayout t = new TextLayout(attstring.getIterator(), frc);
    return t.getOutline(null);
}

这将使用字距绘制文本,并允许在图形上下文上进行缩放。但是,现在某些字符之间的间距(空白)有时会弄乱

enter image description here

enter image description here


共 (0) 个答案