在使用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中起作用?
答案 0 :(得分:1)
在Java 6中,“ Serif”是一种逻辑字体。物理字体是在某个时候引入的,似乎您的系统上实际上有一个名为“ Serif”的物理字体。使用不同的物理字体系列。或暂时使用“ Sans-Serif”。
在Java中,人们可以遍历所有GrahicsEnvironment's fonts:
GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
for (String fontName : getAvailableFontFamilyNames()) {
System.out.println(fontName);
}