为什么使用Graphics2D.drawString绘制字号为101的字母"o"会出现问题?

4

我想在png图像中绘制字符串。我需要高度最多为600像素的字母。

因此,我尝试使用Graphics2D.drawString:

    String text = "o";
    graphics.setFont(font.deriveFont(Font.PLAIN, fontsize));
    graphics.drawString(text, 0, 200);

字体大小高达100的文本可以正常工作。 问题:字体大小为101时,一些圆形字符(如“o”)会有点倾斜。

这是使用字体“Abril_Fatface”、“Amatic_SC”和“Cinzel_Decorative”(来自Google Fonts,例如https://fonts.google.com/specimen/Abril+Fatfacehttps://fonts.google.com/specimen/Amatic+SC;ttf文件可通过“选择此字体”然后在“选择1个家族”对话框中点击“下载此部分”进行下载)可重现。使用其他字体可以正确显示字符串。

LibreOffice显示字符呈圆形(如预期所示)。

以下是完整代码:

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontFormatException;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    public class CustomFontWriting {
        public static void main(String[] args) throws FontFormatException, IOException {
            Font font = Font.createFont(Font.TRUETYPE_FONT, new File("Amatic_SC.ttf"));
            // Create empty image
            BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
            Graphics2D graphics = image.createGraphics();
            graphics.setColor(Color.BLACK);
            // Draw letter "o" with fontsize 101 in an image
            graphics.setFont(font.deriveFont(Font.PLAIN, 101));
            graphics.drawString("o", 0, 200);
            // Write image to disk
            File output = new File("output.png");
            ImageIO.write(image, "png", output);
        }
    }

预期结果:圆形字母“o”。
实际结果:倾斜的字母“o”。 enter image description here

似乎解释路径坐标的部分出了问题 - 你可能需要在Java错误跟踪器上提出一个完整的 [mcve] 来咨询。这是使用Oracle的JDK还是OpenJDK? (或者甚至是一些第三方,其他版本?) - Mike 'Pomax' Kamermans
这种情况发生在OpenJDK 1.8.0_212中。 - S. Doe
示例现在变得更短了,但仍然能够重现问题。使用Java SE RE 1.8.0_171-b11时,不会出现这样的问题。示例字母完美地呈现圆形。 - S. Doe
2
然后(基于此),您可能希望将其提交到bugs.java.com,明确说明这是针对OpenJDK 1.8而不是Oracle JDK。他们可能正在使用需要版本升级的较旧版本的harfbuzz / freetype / uniscribe等,或者甚至可能存在需要先修复的依赖的造型引擎中的错误。 - Mike 'Pomax' Kamermans
2
好的,我已经在bugs.java.com上提交了此问题,并且还使用更新的OpenJDK版本1.11.3(2019-04-16)进行了测试。使用OpenJDK 11,我的测试用例成功生成了圆形字母。太棒了!这是我将要采取的解决方案。谢谢! :-) - S. Doe
1个回答

0
一个解决方案是使用OpenJDK 11或更高版本。请参见问题下的评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接