如何让缩放后的BufferedImage与Robot全屏截图画质完全一致?
高DPI显示器下截图显示的分辨率与尺寸匹配问题
我尝试将屏幕截图以ImageIcon形式显示在JLabel上,使用Robot对象结合MultiResolutionScreenCapture生成BufferedImage对象。我的显示器设置为175%缩放,此时截图分辨率会随显示器缩放比例改变:
- 显示缩放后的截图时,尺寸正确但分辨率与显示器不符
- 显示原始尺寸截图时,尺寸超出捕获区域但分辨率正确
不同缩放效果对比
- 缩放后效果:

- 原始尺寸效果:

- 双线性插值缩放效果:

- img.getScaledInstance方法效果:

当前实现代码
public static void updateCurrentSelection(Rectangle rect) { Robot robot; try { robot = new Robot(); } catch (AWTException e) { e.printStackTrace(); return; } MultiResolutionImage multiResImg = robot.createMultiResolutionScreenCapture(rect); java.util.List<Image> imgs = multiResImg.getResolutionVariants(); Image img = imgs.getLast(); // 获取最大尺寸图像 mainMenu.setImage(img, imgs.getFirst().getWidth(mainMenu), imgs.getFirst().getHeight(mainMenu)); // 传入较小尺寸用于缩放 } public void setImage(Image img, int width, int height) { BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = buf.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(img, 0, 0, width, height, null); g.dispose(); selectionLabel.setIcon(new ImageIcon(buf)); }
我试过用Graphics2D手动缩放原始尺寸图像,也调整了抗锯齿和插值设置,虽有改善但没达到预期。有没有办法让程序窗口中显示的图像和显示器画质完全一致?期望显示的图像在分辨率和尺寸上都与原生屏幕匹配。
内容的提问来源于stack exchange,提问作者Steven Tracey
相关产品推荐
相关产品推荐

