Почему Java ImageIO генерирует разные образы на разных машинах (Linux против Windows)? - PullRequest
0 голосов
/ 04 марта 2012

Я использую javax.imageio для генерации изображений из текстовых строк в Windows и Linux, и я считаю, что изображения очень различаются по качеству (Linux = низкое качество, небольшой физический размер, хотя и те же размеры).

Linux (Ubunutu), 443 байта

enter image description here

Windows 7, 1242 байта

enter image description here

Я использую тот же файл шрифтов (из 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);
    }
}

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Просто предположение, но ваши изображения выглядят так, как будто это может происходить из-за разного поведения сглаживания при рендеринге текста в изображение. Это означает, что разница не возникает во время сжатия или кодирования png изображения, но уже при рендеринге текста в изображение. Если сглаживание текста отсутствует, изображение можно сжать до меньшего размера, поскольку оно содержит меньше разных цветов, что также может объяснить разницу в размере файла.

Попробуйте поэкспериментировать с точным указанием параметров сглаживания вместо того, чтобы полагаться на системные значения по умолчанию, и посмотрите, имеет ли это значение. Вы можете сделать это, добавив RenderingHints к объекту Graphics2D, например, подсказка рендеринга text_antialising:

http://docs.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html#KEY_TEXT_ANTIALIASING

Также см. Здесь для обсуждения поведения рендеринга шрифта:

Визуализация шрифтов Java

0 голосов
/ 04 марта 2012

один раз, когда вы говорите, что хотите создавать только строковые изображения, тогда в коде, который вы говорите, вы делаете изображения из html ... укажите это

только для строк: возможно, в linux сам ярлык устанавливаетдругие свойства для графики, так что делайте это сами и не используйте метод рисования меток ... может быть связан с Window-UI linux

html: попробуйте использовать JTextPane, он должен иметь расширенные настройки HTML... может быть, это улучшает качество

...