java - 在 Linux 上从 Java 透明地使用 Windows 截取屏幕截图时出现问题

标签 java linux screenshot transparency


我在使用透明窗口从 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
robotScreenshotBefore.png

gnome-screenshot.png
gnome-screenshot.png

robotScreenshotAfter.png
robotScreenshotAfter.png

关于java - 在 Linux 上从 Java 透明地使用 Windows 截取屏幕截图时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52382343/

相关文章:

android - Bitmap.createBitmap 返回 null

java - 类似于基本 Java 中的 FileCopyUtils.copy 方法

java - 如何使用 dbus-java 注册 dbus 对象?

python - 如何在我的录音中显示鼠标指针

c# - 事件窗口外边框截图

mysql - 将远程数据库 View 作为表复制到本地数据库

java - 有eclipse需要安装Java SDK吗

Java Neo4J 内存不足

java - String.valueOf(int value) 给出错误

linux - 来自网站的语音调用、用户响应