使用Java将1000像素图像调整为200像素时,图像质量更好

时间:2019-10-01 14:37:58

标签: java bufferedimage java-2d

我必须将Java中的图像大小从大约1000px调整为200px,然后将它们复制到Web文件夹,以200px的分辨率显示在HTML报告中。 (请注意,我必须创建这些文件,因为原始图像将无法用于Web服务器,并且仅复制原始图像将需要太多空间。)

尽管原始图像质量通常较高,但200px的图像可能有点粗糙,我可以调整下面的代码以产生质量更好的图像

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 :(得分:0)

您可以通过打开抗锯齿来提高质量。在您的情况下,将是:

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);

答案 1 :(得分:0)

要获得比Java的“抗锯齿”双线性重采样更好的质量,可以使用针对缩略图优化的imageScalr之类的库,也可以使用我自己的ImageUtilities这样的库,其质量可能更好/不同* >

*)我的图像会产生科学上准确的重采样,而缩略图像imageScalr结果略微锐化时,主观上可能看起来更好。我的要快得多。