Java 不是合成斜体字体
Java is not Synthesizing Italic Font Faces
主要问题:
OpenJDK 中是否有一个设置可以像 Oracle JDK 那样合成斜体字体。
背景:
使用 OpenJDK,在 Graphics2D 对象上绘制文本时,文本不会以倾斜样式显示,除非已使用所需字体系列注册了斜体字体。 Oracle 的 JDK 确实合成了斜体字体。 Swing组件也合成了。
备注:
- 粗体是综合的,粗体斜体只是粗体的综合。
- 我知道为了获得最佳效果,应该注册斜体字体。对于已经利用合成字体的应用程序,这可能不是一个完美的解决方案。
- 有很多关于 JavaFX 和字体的内容,这不是 JavaFX,只是 AWT。
这里有一个简单的 class 来说明这个问题。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UnsupportedLookAndFeelException;
public class SimpleFontTest {
private static Font FONT = new Font("Impact", Font.ITALIC, 18);
private static String TEXT = "The Quick Brown Fox";
public static void main(String args[]) throws UnsupportedLookAndFeelException {
if (args.length > 0 && args[0] != null) {
String fontName = args[0];
FONT = new Font(fontName, Font.ITALIC, 18);
}
JFrame f = new JFrame("Simple Font Test: " + System.getProperty("java.vendor"));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("JLabel: " + TEXT);
label.setFont(FONT);
GraphicsConfiguration gc = f.getGraphicsConfiguration();
BufferedImage image = gc.createCompatibleImage(400, 50);
Graphics2D g = image.createGraphics();
g.setFont(FONT);
g.setColor(Color.BLACK);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, image.getWidth(), image.getHeight());
g.drawString("BufferedImage: " + TEXT, 10, 15);
g.dispose();
JLabel picLabel = new JLabel(new ImageIcon(image));
f.add(label, BorderLayout.PAGE_START);
f.add(picLabel, BorderLayout.CENTER);
f.setSize(400, 200);
f.setVisible(true);
}
}
输出将取决于用于构建的 JDK 和 运行 class。这是一张对比图:
谢谢大家。
因为我不喜欢看到没有答案的问题:看起来这只是从 T2K 字体渲染器更改为 FreeType 的结果。
一些解决方法:
- 制作斜体字体(如果许可合法允许)
- 将 AffineTransform 应用于 Font 对象(-20 的倾斜效果很好)。
主要问题:
OpenJDK 中是否有一个设置可以像 Oracle JDK 那样合成斜体字体。
背景:
使用 OpenJDK,在 Graphics2D 对象上绘制文本时,文本不会以倾斜样式显示,除非已使用所需字体系列注册了斜体字体。 Oracle 的 JDK 确实合成了斜体字体。 Swing组件也合成了。
备注:
- 粗体是综合的,粗体斜体只是粗体的综合。
- 我知道为了获得最佳效果,应该注册斜体字体。对于已经利用合成字体的应用程序,这可能不是一个完美的解决方案。
- 有很多关于 JavaFX 和字体的内容,这不是 JavaFX,只是 AWT。
这里有一个简单的 class 来说明这个问题。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UnsupportedLookAndFeelException;
public class SimpleFontTest {
private static Font FONT = new Font("Impact", Font.ITALIC, 18);
private static String TEXT = "The Quick Brown Fox";
public static void main(String args[]) throws UnsupportedLookAndFeelException {
if (args.length > 0 && args[0] != null) {
String fontName = args[0];
FONT = new Font(fontName, Font.ITALIC, 18);
}
JFrame f = new JFrame("Simple Font Test: " + System.getProperty("java.vendor"));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("JLabel: " + TEXT);
label.setFont(FONT);
GraphicsConfiguration gc = f.getGraphicsConfiguration();
BufferedImage image = gc.createCompatibleImage(400, 50);
Graphics2D g = image.createGraphics();
g.setFont(FONT);
g.setColor(Color.BLACK);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, image.getWidth(), image.getHeight());
g.drawString("BufferedImage: " + TEXT, 10, 15);
g.dispose();
JLabel picLabel = new JLabel(new ImageIcon(image));
f.add(label, BorderLayout.PAGE_START);
f.add(picLabel, BorderLayout.CENTER);
f.setSize(400, 200);
f.setVisible(true);
}
}
输出将取决于用于构建的 JDK 和 运行 class。这是一张对比图:
谢谢大家。
因为我不喜欢看到没有答案的问题:看起来这只是从 T2K 字体渲染器更改为 FreeType 的结果。
一些解决方法:
- 制作斜体字体(如果许可合法允许)
- 将 AffineTransform 应用于 Font 对象(-20 的倾斜效果很好)。