有没有办法使用Java截取屏幕截图并将其保存为某种图像?

jjn*_*guy 125 java screenshot image

标题简单说明:您是否可以仅使用Java命令截取屏幕并保存?或者,我是否需要使用特定于操作系统的程序来截取屏幕截图然后将其从剪贴板中取出?

Dav*_*ron 183

信不信由你,你实际上可以java.awt.Robot用来"创建一个包含从屏幕读取的像素的图像".然后,您可以将该映像写入磁盘上的文件.

我只是试了一下,整个事情最终结果如下:

Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = new Robot().createScreenCapture(screenRect);
ImageIO.write(capture, "bmp", new File(args[0]));
Run Code Online (Sandbox Code Playgroud)

注意:这将仅捕获主监视器.有关多显示器支持,请参阅GraphicsConfiguration.

  • 有没有办法捕捉鼠标光标?! (3认同)
  • 机械手在屏幕截图中不包括鼠标。是否有类似的功能完全相同,但是鼠标是否包括在内? (2认同)

Dej*_*kic 24

我从不喜欢使用Robot,所以我制作了自己的简单方法来制作JFrame对象的截图:

public static final void makeScreenshot(JFrame argFrame) {
    Rectangle rec = argFrame.getBounds();
    BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height, BufferedImage.TYPE_INT_ARGB);
    argFrame.paint(bufferedImage.getGraphics());

    try {
        // Create temp file
        File temp = File.createTempFile("screenshot", ".png");

        // Use the ImageIO API to write the bufferedImage to a temporary file
        ImageIO.write(bufferedImage, "png", temp);

        // Delete temp file when program exits
        temp.deleteOnExit();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么你不喜欢机器人? (16认同)
  • 另一方面,这只获取窗口的内容,而使用`Robot`,您还可以获得窗口的框架和标题栏. (6认同)
  • 看起来这应该具有工作的优势,即使在截取屏幕截图之前目标窗口被遮挡. (3认同)
  • 将其简单地视为品味问题。 (2认同)

111*_*01b 18

如果您想捕获所有监视器,可以使用以下代码:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();

Rectangle allScreenBounds = new Rectangle();
for (GraphicsDevice screen : screens) {
    Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();

    allScreenBounds.width += screenBounds.width;
    allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height);
}

Robot robot = new Robot();
BufferedImage screenShot = robot.createScreenCapture(allScreenBounds);
Run Code Online (Sandbox Code Playgroud)

  • 计算它会更好[这种方式](http://stackoverflow.com/a/13380999/446591) (3认同)

use*_*881 10

public void captureScreen(String fileName) throws Exception {
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   Rectangle screenRectangle = new Rectangle(screenSize);
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(screenRectangle);
   ImageIO.write(image, "png", new File(fileName));
}
Run Code Online (Sandbox Code Playgroud)