Graphics2D.drawString
без антиалиасинга даёт «попиксельно» разные результаты на разных машинах. С антиалиасингом так вообще разница огромная. Пример как рендерю текст:
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class Test {
public static void main(String... args) throws FontFormatException, IOException {
int x = 0;
int y = 9;
int width = 80;
int height = 10;
float fontSizeInPixels = 9f;
String text = "PseudoText";
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
URL fontUrl = new URL(
"https://github.com/indvd00m/graphics2d-drawstring-test/blob/master/src/test/resources/fonts/DejaVuSansMono/DejaVuSansMono.ttf?raw=true");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
font = font.deriveFont(fontSizeInPixels);
Color fontColor = Color.BLACK;
Color backgroundColor = Color.WHITE;
graphics.setFont(font);
graphics.setColor(backgroundColor);
graphics.fillRect(0, 0, width, height);
graphics.setColor(fontColor);
graphics.drawString(text, x, y);
ImageIO.write(image, "png", new File("/tmp/test.png"));
}
}
Сделал проект для тестов:
https://github.com/indvd00m/graphics2d-drawstring-test
Вот пример сборки на TravisCI:
https://travis-ci.org/indvd00m/graphics2d-drawstring-test/builds/178672466
Из 7 конфигураций ОС/версия_явы на 2-х тест пройден, остальные провалились. Собственно и вопрос, можно ли это пофиксить и везде получать попиксельно одинаковый результат.