我在使用透明窗口从 Linux 上的 Java 截图时遇到问题。
问题是使用 Robot 截取的屏幕截图处理透明窗口时就好像它们是不透明的一样。
它与以下位置所述的问题非常相似:Taking a screenshot in Java on Linux?
不知有没有什么满意的解决方法可以避免这个问题。
这是我用来截屏的代码:
protected BufferedImage getScreenShot()
{
BufferedImage screenShotImage = null;
try
{
screenShotImage = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
}
catch( Exception ex )
{
ex.printStackTrace();
}
return( screenShotImage );
}
获取屏幕截图的代码如下(在派生的JFrame类中):
public void M_repaint( )
{
long timeStamp = System.currentTimeMillis();
if( ( timeStamp - _lastScreenShotTimeStamp ) > 4000 )
{
updateAlpha( 0.0f );
SwingUtilities.invokeLater( new Runnable(){
@Override
public void run()
{
BufferedImage image = getScreenShot();
try
{
ImageIO.write(image, "png", new File( "robotScreenshotBefore.png"));
}
catch( Exception ex )
{
ex.printStackTrace();
}
try
{
String[] cmd = { "./lens.screenshot.sh" };
Process script_exec = Runtime.getRuntime().exec(cmd);
script_exec.waitFor();
}
catch( Exception ex )
{
ex.printStackTrace();
}
image = getScreenShot();
try
{
ImageIO.write(image, "png", new File( "robotScreenshotAfter.png"));
}
catch( Exception ex )
{
ex.printStackTrace();
}
_lensJPanel.setScreenShotImage( image );
updateAlpha( 1.0f );
}
});
_lastScreenShotTimeStamp = timeStamp;
}
repaint();
}
脚本./lens.screenshot.sh 包含以下内容:
#/bin/bash
rm gnome-screenshot.png
gnome-screenshot --file="gnome-screenshot.png"
应用是一个放大镜。
应用程序的工作方式是每次窗口(镜头)改变其在屏幕上的位置时,都会调用函数 M_repaint( )。
在那个函数里面有一种计时器,当窗口外观发生变化时,当从上一个屏幕截图开始经过 4 秒时,会拍摄一个新的屏幕截图
以前截取屏幕截图时,JFrame 不可见,因此它不会出现在屏幕截图本身内。
但是一旦窗口被绘制在屏幕上,它就会出现在屏幕截图中,即使它之前是不可见的。
我附上一组从应用程序中截取的一组截图,其中包含 previus 代码(robotScreenshotBefore.png、gnome-screenshot.png 和 robotScreenshotAfter.png)
最佳答案
我已经更新了问题的信息,我也会附上从Linux机器上截取的屏幕截图
正如我们可以看到的第一个屏幕截图(在正常执行中发生的屏幕截图),显示了刚刚变为透明的窗口。
以下两张截图显示了正确隐藏的窗口(第一张是直接从 Linux 上截取的,最后一张是在调用 gnome 截屏工具后用 Robot 截取的)
问题是应用程序在截取屏幕截图之前不能等待这么多时间,因为这个等待时间显示为令人讨厌的闪烁。
robotScreenshotBefore.png
gnome-screenshot.png
robotScreenshotAfter.png
关于java - 在 Linux 上从 Java 透明地使用 Windows 截取屏幕截图时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52382343/