Я столкнулся с проблемой получения снимков экрана с Java на Linux с прозрачными окнами.
Проблема в том, что скриншот, сделанный с помощью робота, имеет дело с прозрачными окнами, как будто они были непрозрачными.
Это очень похоже на проблему, изложенную в: Сделать снимок экрана в Java на 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)