Java 缓冲图像抗锯齿不起作用

问题描述 投票:0回答:1

我正在开发一个 Java 桌面应用程序,并注意到当将图像缩小到 50 像素左右时,图像往往看起来非常像素化且清晰。我尝试了多种方法来解决这个问题,包括

//I've tried every kind of interpolation, but to no avail
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

不过这些似乎对图像没有影响。我想知道是否有办法让它们更平滑。

在我的应用程序中:

a

在 VS Code 照片查看器中,比例为 10%(大约相同大小)

enter image description here

如有任何帮助,我们将不胜感激! 注意:仅在缩小图像尺寸时才会出现此问题。以 256x256 像素大小显示 256x256 分辨率图像完全可以正常工作。

编辑:这是一个最小的可重现示例,以显示插值/抗锯齿如何没有区别:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(400, 400);

final BufferedImage image = ImageIO.read(new File("home.png"));

JPanel pane = new JPanel() {
      @Override
      protected void paintComponent(Graphics g) {
          super.paintComponent(g);
                
           Graphics2D g2d = (Graphics2D) g;

           g2d.setColor(Color.gray);
           g2d.fillRect(0, 0, 400, 400);

           //two examples, image on the left is without interpolation, image on the right is with interpolation
           g2d.drawImage(image, 200, 200, 35, 35, null);

           g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
           g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
           g2d.drawImage(image, 250, 200, 35, 35, null);
       }
};


frame.add(pane);
frame.setVisible(true);

该程序使用此图像: https://imgur.com/6xto1o5

产生的结果如下:

enter image description here

左边的房子是在没有插值/抗锯齿的情况下绘制的,右边的图像则两者都有。正如您所看到的,没有明显的差异。

java swing awt antialiasing
1个回答
0
投票

感谢@gthanop@Abra提供答案,我会在这里快速总结一下:

您可以调用

Image.getScaledInstance(width, height, hint)
来获取图像的调整大小版本。但是,如果您为其提供
Image.SCALE_SMOOTH
作为
hint
参数,则图像将以保持“平滑度”的方式缩小。

© www.soinside.com 2019 - 2024. All rights reserved.