为什么带有Graphics2D.drawString的101号字体的字母“ o”损坏了?

时间:2019-07-08 18:54:42

标签: java fonts awt graphics2d

我想在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字体,例如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”。

enter image description here

实际结果:斜角字母“ o”。

1 个答案:

答案 0 :(得分:0)

一个解决方案是使用OpenJDK 11或更高版本。查看问题的评论。