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

使用Java将1000px图像调整为200px时,图像质量更好,java,bufferedimage,java-2d,Java,Bufferedimage,Java 2d,我必须在Java中将图像的大小从大约1000px调整到200px,然后将它们复制到web文件夹中,以200px的分辨率显示在Html报告中。(注意,我必须创建这些文件,因为原始图像将不可用于Web服务器,仅复制原始图像将需要太多空间。) 虽然原始图像的质量非常高,但200px图像可能非常粗糙,我可以调整下面的代码以生成质量更好的图像吗 public static BufferedImage resizeUsingImageIO(Image srcImage, int size) {

我必须在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;

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

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

为了获得比Java的“抗锯齿”双线性重采样更好的质量,您可以使用针对缩略图进行优化的库,或者我自己的库,它们可能具有更好/不同的质量*


*)我的方法可以产生科学上精确的重采样,而缩略图在主观上看起来会比ImageScaler的结果稍微过锐化的效果更好。我的要快得多。

有人反对将此作为副本关闭吗?另一个问题给出了大量的理论答案,但没有给出实际操作的简单答案,这个问题似乎是对链接问题的答案,显示了一个,具有调整图像大小并将其存储为具有任意质量的JPG的方法。它可以看作是一个纯效用函数。我还比较了中不同缩放方法的性能,不同的
scaleWith…
方法很容易重复使用。我没有注意到任何差异,如果我能够更新答案,请尝试一下,让我知道它是否提高了质量。好的,我可以尝试,但与标准Java方法相比,性能如何?