java - Java 6 之后 Graphics2D drawString 产生无意义字符

标签 java graphics2d

在使用 Java 8 将旧应用程序迁移到较新的服务器时,出现了这个问题:图像中在 Java 6 中看起来不错的单词在 Java 7 和 8 中却变成了无意义的字符。

这是我的测试代码:

package test;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import java.io.*;

public class PicTest {

    public static void main(String[] args){
        String testNum = args[0];
        String fileName = "image"+testNum+".jpg";
        String testText = "Test "+testNum;

        BufferedImage image = new BufferedImage(200,200, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Font font = new Font("Serif", Font.PLAIN, 24);
        g2.setFont(font);
        g2.drawString(testText, 10, 20);
        File outputfile = new File(fileName);
        try {
            ImageIO.write(image, "jpg", outputfile);
        } catch (Exception e) {
            e.printStackTrace();
        }
   }
}

当我使用 Java 6 运行它时...

$ /usr/local/java/java6/bin/javac test/PicTest.java
$ /usr/local/java/java6/bin/java test/PicTest 4

...这是(预期的、正常的)输出图像: test image 4 using Java 6

当我使用 Java 7 运行它时...

$ /usr/local/java/java7_17/bin/javac test/PicTest.java
$ /usr/local/java/java7_17/bin/java test/PicTest 5

...这是输出图像(带有无意义的字符): test image 5 using Java 7

我使用 Java 8 获得的图像与 Java 7 相同。

Java 6 我指的是 jdk1.6.0_34 我所说的 Java 7 指的是 jdk1.7.0_17

我是否应该使用不同的库或进行不同的设置才能使其适用于更新版本的 Java?

最佳答案

在java 6中“Serif”是一种逻辑字体。物理字体在某个时候被引入,看起来您的系统上实际上有一个名为“Serif”的物理字体。使用不同的物理字体系列。或暂时“Sans-Serif”。​​

在java中,我们可以遍历所有GrahicsEnvironment's fonts :

GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
for (String fontName : getAvailableFontFamilyNames()) {
    System.out.println(fontName);
}

关于java - Java 6 之后 Graphics2D drawString 产生无意义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52704605/

相关文章:

java - Android 中的 Web 服务器通信安全

java - 怎么画一个长方形,中间挖出一个圆圈?

java - super.paint() 在图像上不可见

java - 口袋妖怪黄色包装过渡

java - 为什么 Eclipse 在 Windows 中使用 c :\WINDOWS\SYSTEM32\javaw. exe?

java - Webdriver 使用 sendKeys 输入长字符串的最简单方法?

java - 如何声明 Interface 类型的变量,然后将实现该 Interface 的 Class 的对象分配给该变量,以及如何测试这一点?

java - 在另一幅图像下旋转一幅图像

java - servlet 中后台的路径

java - 动画列表上未绑定(bind)前缀错误