Graphics2D drawString создает бессмысленные символы после Java 6 - PullRequest
0 голосов
/ 08 октября 2018

При переносе более старого приложения на новый сервер с 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

... вот (ожидаемое, нормальное) выходное изображение: тестовое изображение 4используя 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изображение 5 с использованием Java 7

Изображение, полученное с использованием Java 8, аналогично Java 7.

Под Java 6 я имею в виду jdk1.6.0_34 Под Java 7 я имею в виду jdk1.7.0_17

Должен ли я использовать разные библиотеки или настраивать их по-разному, чтобы эта работа работала с более поздними версиями Java?

1 Ответ

0 голосов
/ 08 октября 2018

В Java 6 "Serif" является логическим шрифтом.Физические шрифты были введены в какой-то момент, и кажется, что у вас на самом деле есть физический шрифт с именем «Serif» в вашей системе.Используйте другое физическое семейство шрифтов.Или "Sans-Serif" на данный момент.

В java можно перебирать все шрифты GrahicsEnvironment :

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