[英]Is there a way to headlessly screenshot a swing (or awt) window?
有一个使用swing的旧版应用程序,它会在不同时间产生各种目的的各种窗口。 我想知道的是,是否有可能获得每个窗口的“屏幕快照”,而不必实际通过操作系统上的屏幕快照实用程序。 我知道这是有可能的 ,但是我想知道swing / java是否很好地支持了它? 我很想通过此应用程序加载文件,遍历生成的窗口,然后在某个位置写出图像。
我知道有两种方法可以执行此操作,一种方法是捕获窗口的装饰(顶部的按钮以及其他类似内容),另一种方法则不需要。
如果您不想捕获装饰,则可以将其绘制为图像,如下所示:
public static void saveImage(JFrame frame, File target, String extension) throws IOException{
BufferedImage img = new BufferedImage(frame.getContentPane().getWidth(),
frame.getContentPane().getHeight(),
BufferedImage.TYPE_INT_RGB);
frame.getContentPane().paint(img.getGraphics());
ImageIO.write(img, extension, target);
}
这将创建所需大小的新图像,将内容绘制到其中,然后保存。
如果要捕获所有内容,可以使用Robot
类的createScreenCapture
方法 ,如下所示:
public static void saveImage(JFrame frame, File target, String extension) throws IOException{
Point pos = frame.getLocationOnScreen();
Dimension size = frame.getSize();
Rectangle rect = new Rectangle(pos.x, pos.y, size.width, size.height);
Robot robot = new Robot();
BufferedImage bi = robot.createScreenCapture(rect);
ImageIO.write(bi, extension, target);
}
至于让每个窗口截图,您可以手动跟踪所需的窗口,也可以使用Frame.getFrames()
或Window.getWindows()
获取所有活动Window.getWindows()
的数组,然后对其进行迭代。
Sikuli非常简洁,它允许您基于图像识别使任何东西自动化。 他们的网站: www.sikuli.org 。 它可以在运行您编写的自动化任务时截取屏幕截图 : 如何使用sikuli截取屏幕截图
我完全不隶属于sikuli,过去我只是使用它(在摆动的GUI上自动执行测试)。 他们网站上的说明:
Sikuli可自动执行您在屏幕上看到的所有操作。 它使用图像识别来识别和控制GUI组件。 当无法轻松访问GUI的内部或源代码时,此功能很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.