Лучшее качество изображения при изменении размера изображения от 1000 до 200 пикселей с использованием Java - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно изменить размер изображений в Java примерно с 1000 до 200 пикселей, затем они копируются в веб-папку для отображения в HTML-отчете с разрешением 200 пикселей. (Обратите внимание, что я должен создать эти файлы, потому что исходные изображения не будут доступны веб-серверу, и простое копирование исходных изображений потребует слишком много места.)

Хотя исходные изображения обычно высокого качества, изображения размером 200 пикселейможет быть довольно зернистым, могу ли я настроить код ниже для получения более качественных изображений

public static BufferedImage resizeUsingImageIO(Image srcImage, int size)
    {
        int w = srcImage.getWidth(null);
        int h = srcImage.getHeight(null);

        // Determine the scaling required to get desired result.
        float scaleW = (float) size / (float) w;
        float scaleH = (float) size / (float) h;

        MainWindow.logger.finest("Image Resizing to size:" + size + " w:" + w + ":h:" + h + ":scaleW:" + scaleW + ":scaleH" + scaleH);

        //Create an image buffer in which to paint on, create as an opaque Rgb type image, it doesn't matter what type
        //the original image is we want to convert to the best type for displaying on screen regardless
        BufferedImage bi = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);

        // Set the scale.
        AffineTransform tx = new AffineTransform();
        tx.scale(scaleW, scaleH);

        // Paint image.
        Graphics2D g2d = bi.createGraphics();
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, size, size);
        g2d.setComposite(AlphaComposite.SrcOver);
        g2d.drawImage(srcImage, tx, null);
        g2d.dispose();
        return bi;

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Для лучшего качества, чем билинейная ресэмплирование Java, можно использовать библиотеку, такую ​​как imageScalr , которая оптимизирована для миниатюр, или мою собственную ImageUtilities , которая может иметь лучшее / другое качество*

*) Mine производит точные с научной точки зрения передискретизации, в то время как миниатюры могут субъективно выглядеть лучше, если слегка заострены, как результаты imageScalr. Мой намного быстрее.

0 голосов
/ 01 октября 2019

Вы можете повысить качество, включив сглаживание. В вашем случае это будет:

Graphics2D g2d = bi.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
...