为什么字体大小为 101 的字母 "o" 和 Graphics2D.drawString 损坏了?
Why is letter "o" with Graphics2D.drawString at font size 101 broken?
我想在 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+Fatface or https://fonts.google.com/specimen/Amatic+SC ;ttf 文件可通过 "select this font",然后在对话框“1 family selected”中选择 "download this section")。使用其他字体可以绘制字符串。
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"。
一种解决方案是使用 OpenJDK 11 或更高版本。查看问题的评论。
我想在 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+Fatface or https://fonts.google.com/specimen/Amatic+SC ;ttf 文件可通过 "select this font",然后在对话框“1 family selected”中选择 "download this section")。使用其他字体可以绘制字符串。
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"。
一种解决方案是使用 OpenJDK 11 或更高版本。查看问题的评论。