Я использую javax.imageio для генерации изображений из текстовых строк в Windows и Linux, и я считаю, что изображения очень различаются по качеству (Linux = низкое качество, небольшой физический размер, хотя и те же размеры).
Linux (Ubunutu), 443 байта
![enter image description here](https://i.stack.imgur.com/D9lcC.png)
Windows 7, 1242 байта
![enter image description here](https://i.stack.imgur.com/LhUVO.png)
Я использую тот же файл шрифтов (из Windows, загружен в Linux) и использую этот код для генерации изображений.Любая идея, как улучшить качество изображений, созданных Linux?Почему сгенерированные изображения отличаются в первую очередь?
Я пытался установить явное сжатие (через iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
), но я получаю исключение UnsupportedOperationException при попытке этого.
Обновление:
Вот SSCCE.Я обновил свой пример и удалил шрифт, результаты соответствуют.Они также случаются, если вы устанавливаете шрифт в обеих системах.
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Example {
/**
* <p>Create an image from text. <p/>
* <p/>
* http://stackoverflow.com/a/4437998/11236
*/
public static void createFromText(String text, Path outputFile, int width, int height, Color color, int fontSize) {
JLabel label = new JLabel(text, SwingConstants.CENTER);
label.setSize(width, height);
label.setForeground(color);
BufferedImage image = new BufferedImage(
label.getWidth(), label.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics g = null;
try {
// paint the html to an image
g = image.getGraphics();
g.setColor(Color.BLACK);
label.paint(g);
} finally {
if (g != null) {
g.dispose();
}
}
// get the byte array of the image (as jpeg)
try {
ImageIO.write(image, "png", outputFile.toFile());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
Path output = Paths.get("/tmp/foo.png");
createFromText("Custom Text", output, 200, 40, Color.blue, 30);
}
}