Robot.createScreenCapture está retornando uma janela preta (Print Screen)

2 respostas
Dieval_Guizelini

Senhores,

ou o createScreenCapture não está conseguindo capiturar a tela ou quando faço para "plotar" a imagem o java não consegue interpretar a imagem capturada.

Não encontrei nenhuma mensagem que trata a respeito, o código abaixo é como faço a capitura:

GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
            GraphicsConfiguration config = device.getDefaultConfiguration();
            Rectangle quadro = config.getBounds();
            
            java.awt.Robot robot = new java.awt.Robot();
            BufferedImage bi = robot.createScreenCapture( quadro );
Como eu estou imprimindo o gráfico em uma subclasse de JPanel:
public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }

O problema encontra-se quando na tela do Windows ou do Linux está passando um vídeo ou outra programa que apresente imagens em 32bits. Em outras situações, como telas de programas normais ou mesmo com o photoshop o programa funciona.

A configuração de vídeo está para 1280x1024 e 32bits de cor.
A versão da vm é:

Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode)

SO: MS Windows Vista 64 bits
e Ubuntu 7.04.

Os testes que fiz com o que tem nesses links também produzem o mesmo erro:
[url]http://forum.java.sun.com/thread.jspa?threadID=5152920&tstart=225[/url]
[url]http://forum.java.sun.com/thread.jspa?threadID=597936&messageID=4108555[/url]

Se alguém tiver alguma sugestão eu agradeço.

2 Respostas

fenrir

O problema é justamente por estar passando um video. Teve uma época em que eu precisei usar uns programas para capturar videos diretamente da internet (os videos transmitidos por streaming não podem ser salvos, se assim estiverem configurados).

A única forma de conseguir essa captura era desabilitar uma propriedade na placa de video, que obviamente não lembro qual era…

O problema não é com a classe Robot. Se bobear, até um “print screen” vai te retornar uma tela preta.

Dieval_Guizelini

Fiz o seguinte teste.

Utilizei o print screen e colei no paint, tudo ok. A image está perfeita.

Fiz um método que tentou colar da área de transferência para um objeto image, o resultado foi:

java.io.IOException: system clipboard data unavailable at sun.awt.windows.WClipboard.getClipboardData(Native Method) at sun.awt.datatransfer.ClipboardTransferable.fetchOneFlavor(ClipboardTransferable.java:101) at sun.awt.datatransfer.ClipboardTransferable.(ClipboardTransferable.java:80) at sun.awt.datatransfer.SunClipboard.getContents(SunClipboard.java:130)

Para imagens que não sejam de 32bits não tem problemas... mas com vídeos está dando erro.

segue o método utilizado para copiar da área de transferência:

Image img = getImageFromClipboard();

    public static Image getImageFromClipboard() {
        Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable clipboardContents = systemClipboard.getContents(null);
        if (clipboardContents == null)
            return null;
        else
            try {
                if (clipboardContents.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                    Image image = (Image) clipboardContents.getTransferData(DataFlavor.imageFlavor);
                    return image;
                }
            } catch (UnsupportedFlavorException ufe) {
                ufe.printStackTrace();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        return null;
    }

Alguém tem alguma idéia de como posso fazer um print screen e capiturar uma tela que esteja reproduzindo um stream?

fw

Criado 7 de novembro de 2007
Ultima resposta 7 de nov. de 2007
Respostas 2
Participantes 2