java - 为什么这个图像在 Java 中缩小后看起来很糟糕?

标签 java graphics image-processing graphics2d

这是原始图片:http://rank.my/public/images/uploaded/orig-4193395691714613396.png

这里缩小到 300x225:

http://rank.my/public/images/uploaded/norm-4193395691714613396.png

这里缩小到 150x112:

http://rank.my/public/images/uploaded/small-4193395691714613396.png

如您所见,300x225 看起来很糟糕,而 150x112 看起来很糟糕。这是我用来缩小图像的代码:

private static BufferedImage createResizedCopy(final BufferedImage source, final int destWidth,
        final int destHeight) {
    final BufferedImage resized = new BufferedImage(destWidth, destHeight, source.getType());
    final Graphics2D bg = resized.createGraphics();
    bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    bg.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    final float sx = (float) destWidth / source.getWidth();
    final float sy = (float) destHeight / source.getHeight();
    bg.scale(sx, sy);
    bg.drawImage(source, 0, 0, null);
    bg.dispose();
    return resized;
}

我在这里做错了什么?图像缩放不必特别快,质量绝对比速度更重要。我使用了错误的技术吗?

最佳答案

解决缩小问题的方法有以下三种。首先是分步进行,每步减量不超过75%。第二种是在调整大小之前对图像进行模糊处理;它缩小得越多,你就越需要模糊。第三种方法是使用一种方法,该方法使用朴素双线性或双三次插值方法使用的 2x2 到 4x4 像素 block 以上的像素 block 进行过滤。随着收缩因子变大,过滤器使用的像素 block 也应变大,否则您会得到混叠伪像,如您在此处看到的那样。

关于java - 为什么这个图像在 Java 中缩小后看起来很糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964979/

相关文章:

Java 应用程序作为系统服务

image-processing - 图像分割 : how to isolate human body figure and a complex background?

matlab - 将时间中值滤波器应用于视频

java - 尝试创建 Toast.makeText 时出错

java - 无法自动连线字段: private org. springframework.security.core.userdetails.UserDetailsS​​ervice

java - TestNG 多个测试类 - 运行其他类

graphics - 为电子图创建图形

c# - 如何在 .NET Core 中查找字体和字符串指标?

c# - 在 Windows 窗体中移动图形

matlab - fspecial ('laplacian' ) 和 del2 matlab 之间有什么区别?