通过 Robot.createScreenCapture 方法获取屏幕截图(无鼠标)时,发现2160x1440的屏幕,只能生成分辨率为 1440 x 960 的图片。系统是 windows11,缩放为 150%,生成的 1440 x 960 分辨率为 2160/1.5 x 1440/1.5 的值;如果 WIDTH 和 HEIGHT 填写1440 x 960,生成的截图是正常的,知识分辨率小一点,如果填写 2160x1440 ,则生成的截图里,桌面的截图在最终生成的整个图像的左上角,其余部分全部为黑色。

BufferedImage screenCapture = robot.createScreenCapture(new Rectangle(0, 0, WIDTH, HEIGHT)); // 截屏

通过分析 Robot.createScreenCapture 方法发现,其确实适配了缩放的情况,也生成了缩放前后的两个尺寸的图像,但是却返回了低分辨率的那一个。

private synchronized BufferedImage[]createCompatibleImage(Rectangle screenRect, boolean isHiDPI) {checkScreenCaptureAllowed();checkValidRect(screenRect);BufferedImage lowResolutionImage;BufferedImage highResolutionImage;DataBufferInt buffer;WritableRaster raster;BufferedImage[] imageArray;if (screenCapCM == null) {/** Fix for 4285201* Create a DirectColorModel equivalent to the default RGB ColorModel,* except with no Alpha component.*/screenCapCM = new DirectColorModel(24,/* red mask */ 0x00FF0000,/* green mask */ 0x0000FF00,/* blue mask */ 0x000000FF);}int[] bandmasks = new int[3];bandmasks[0] = screenCapCM.getRedMask();bandmasks[1] = screenCapCM.getGreenMask();bandmasks[2] = screenCapCM.getBlueMask();// need to sync the toolkit prior to grabbing the pixels since in some// cases rendering to the screen may be delayedToolkit.getDefaultToolkit().sync();GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();gc = SunGraphicsEnvironment.getGraphicsConfigurationAtPoint(gc, screenRect.getCenterX(), screenRect.getCenterY());AffineTransform tx = gc.getDefaultTransform();double uiScaleX = tx.getScaleX();double uiScaleY = tx.getScaleY();int[] pixels;if (uiScaleX == 1 && uiScaleY == 1) {pixels = peer.getRGBPixels(screenRect);buffer = new DataBufferInt(pixels, pixels.length);bandmasks[0] = screenCapCM.getRedMask();bandmasks[1] = screenCapCM.getGreenMask();bandmasks[2] = screenCapCM.getBlueMask();raster = Raster.createPackedRaster(buffer, screenRect.width,screenRect.height, screenRect.width, bandmasks, null);SunWritableRaster.makeTrackable(buffer);highResolutionImage = new BufferedImage(screenCapCM, raster,false, null);imageArray = new BufferedImage[1];imageArray[0] = highResolutionImage;} else {Rectangle scaledRect;if (peer.useAbsoluteCoordinates()) {scaledRect = toDeviceSpaceAbs(gc, screenRect.x,screenRect.y, screenRect.width, screenRect.height);} else {scaledRect = toDeviceSpace(gc, screenRect.x,screenRect.y, screenRect.width, screenRect.height);}// HighResolutionImagepixels = peer.getRGBPixels(scaledRect);buffer = new DataBufferInt(pixels, pixels.length);raster = Raster.createPackedRaster(buffer, scaledRect.width,scaledRect.height, scaledRect.width, bandmasks, null);SunWritableRaster.makeTrackable(buffer);highResolutionImage = new BufferedImage(screenCapCM, raster,false, null);// LowResolutionImagelowResolutionImage = new BufferedImage(screenRect.width,screenRect.height, highResolutionImage.getType());Graphics2D g = lowResolutionImage.createGraphics();g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g.drawImage(highResolutionImage, 0, 0,screenRect.width, screenRect.height,0, 0, scaledRect.width, scaledRect.height, null);g.dispose();if(!isHiDPI) {imageArray = new BufferedImage[1];imageArray[0] = lowResolutionImage;//重点看这里} else {imageArray = new BufferedImage[2];imageArray[0] = lowResolutionImage;//重点看这里imageArray[1] = highResolutionImage;//重点看这里}}return imageArray;}

imageArray[0] 是低分辨率的那个图像。

    public synchronized BufferedImage createScreenCapture(Rectangle screenRect) {return createCompatibleImage(screenRect, false)[0];}

那么既然高分辨率的生成了,如何获取呢?

    public static BufferedImage getHighResolutionImage() throws AWTException {Robot robot = getRobot();MultiResolutionImage multiResolutionImage = robot.createMultiResolutionScreenCapture(new Rectangle(0, 0, WIDTH, HEIGHT));Image image = multiResolutionImage.getResolutionVariant(SCALE_WIDTH, SCALE_HEIGHT);BufferedImage screenCapture = (BufferedImage) image;return screenCapture;}

WIDTH 和 HEIGHT 的值为缩放前的分辨率;在我这个例子里也就是 1440 x 960;
SCALE_WIDTH 和 SCALE_HEIGHT 为缩放后的分辨率;在我这个例子里也就是 2160x1440;

Java Robot 获取高分辨率桌面截图相关推荐

  1. java如何获取系统的桌面路径

    java如何获取系统的桌面路径 //当前用户桌面路径File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory();S ...

  2. python获取桌面截图

    python获取桌面截图有多种方式,常用的两个如下: 1.PIL中的ImageGrab模块 使用PIL中的ImageGrab模块简单,但是效率有点低,截屏一次需110ms. import time i ...

  3. java命令截图,GitHub - xuege-cn/fmj: FMJ (FFMpeg for Java)。通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息、截图等等)。...

    项目介绍 FMJ (FFMpeg for Java) 通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息.截图等等). FFMpeg安装 建议使用 ffmpeg-2.6.1 版本 Li ...

  4. Java Robot对象实现服务器屏幕远程监视

    Java Robot对象实现服务器屏幕远程监视2006-01-16 17:33 作者: xiepan110 出处: BLOG 责任编辑:方舟 摘要: 有时候,在Java应用程序开发中,如:远程监控或远 ...

  5. java robot类自动截屏

    直接上代码: package robot; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.InputE ...

  6. Windows/Linux 下功能强大的桌面截图软件

    说到桌面截图软件,很多人首先想到的是 QQ 自带的截图,或者更高级功能更强大的 Snipaste 截图工具. 独立版本的 QQ 截图至少我目前没找到官方正式的下载链接,默认需要安装和打开 QQ 才能使 ...

  7. java robot 对象_用Java Robot对象实现服务器屏幕远程监视

    用Java Robot对象实现服务器屏幕远程监视 作者:李鲁群 摘要: 有时候,在Java应用程序开发中,如:远程监控或远程教学,常常需要对计算机的屏幕进行截取,由于屏幕截取是比较接近操作系统的操作, ...

  8. java robot 控制 不用用户 界面_编写一个基于Java Robot类的屏幕捕获工具

    Fun and Games(娱乐和游戏)提供了通过Java的Robot类捕获主屏幕设备的功能,并且可以将整个屏幕或者选定的一部分保存为jpeg文件.这篇文章以Swing应用的形式实现了屏幕捕获工具. ...

  9. java 怎么获取形参名_获得方法形参名称列表 -- 哦也,搞定!!

    JAVA获取类的方法的参数名 – 老话题,新方法!! 折腾了一天,终于搞定了.测试了nutz所有的类,均读取正常!! 完美读取任何class的变量名信息! 呵呵,当前,前提是编译时含debug信息. ...

最新文章

  1. 最新版IDEA常用配置指南,打造你的最酷IDE
  2. Java 技术篇-IntelliJ IDEA修改java、jdk版本实例演示
  3. linux下增加磁盘改变指定文件路径分区挂载点和迁移数据
  4. (私人收藏)[开发必备]HTML5最全快速查找离线手册(可查询可学习,带实例)...
  5. 新巴巴运动网 项目第十一天
  6. 面试官Diss我能力不如工作3年
  7. Node学习记录: 图片爬虫
  8. pytho---之easydict使用
  9. 搭建nginx服务器
  10. bin(二进制文件)
  11. ZooKeeper实际应用案例-开发实战
  12. 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型,它们是_______和__________ 答案:float double...
  13. switch语句的ns图怎么画_switch语句流程图 c语言中swtich怎么画流程图
  14. 物流app开发需要多少钱
  15. 论文写作学习心得体会
  16. SSL/TLS 受诫礼攻击漏洞的问题的解决记录
  17. Pyramidal Feature Shrinking for Salient Object Detection阅读笔记
  18. ssms 连接 oracle,【SQL】用SSMS连接Oracle手记
  19. 计算机打开硬盘响应慢,电脑处理多任务卡顿,开机反应慢,换固态硬盘不能解决问题根本...
  20. 射频原理图设计checklist

热门文章

  1. Bancor协议揭秘
  2. java cutdown_Java MouseEvent.isShortcutDown方法代码示例
  3. ifafu最新版本android,ifafu最新版下载
  4. 给树莓派4B安装windows10 专业版
  5. Reddit营销推广引流指南
  6. 蓝叠模拟器多开时,查看多开端口号
  7. Python自动化操作Word15000字超强总结,帮你解放双手!(文末送书 )
  8. 浩辰CAD 2021 “芯”升级,更安全,极速更稳定!
  9. 法国数学家梅齐亚克的砝码问题
  10. android 局域网对讲机