Capturador de telas em java
Quem disse que em java não dava pra fazer? :idea:
O programa abaixo é um capturador de telas em java (trabalha na 1.4 em diante):
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.Toolkit;
import javax.imageio.ImageIO;
import java.io.File;
import java.util.StringTokenizer;
/**
* Description of the Class
*
*@author cmsilva (copernico@javafree.com.br)
*@version 19 de Outubro de 2004
*/
public class ScreenCapture extends JFrame {
private JLabel tela = new JLabel();
private JToolBar barra = new JToolBar();
private Image img;
/**
* Constructor for the ScreenCapture object
*/
public ScreenCapture() {
super("Captura de tela");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
tela.setBorder(BorderFactory.createLoweredBevelBorder());
this.getContentPane().add(tela);
this.barra.add(new CapturaAction());
this.barra.add(new SalvarAction());
this.getContentPane().add(barra, BorderLayout.NORTH);
}
/**
* Captura a tela corrente
*
*/
private void capturar() throws Exception {
Robot robo = new Robot();
//Pega a image
this.img = robo.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
//Gera um thumbnail
Image scaledImg = img.getScaledInstance((int) tela.getSize().getWidth(), (int) tela.getSize().getHeight(), Image.SCALE_FAST);
//Exibe o thumbnail
tela.setIcon(new ImageIcon(scaledImg));
tela.validate();
}
/**
* Salva a tela atual em PNG
*
*/
private void salvar() throws Exception {
if (this.img == null) {
return;
}
JFileChooser jfc = new JFileChooser();
//Define um filtro para os arquivos exibidos no Chooser
jfc.setFileFilter(
new FileFilter() {
public boolean accept(File f) {
StringTokenizer stk = new StringTokenizer(f.getName(), ".");
String ext = null;
while (stk.hasMoreTokens()) {
ext = stk.nextToken();
}
if (ext == null) {
return false;
}
if (ext.equalsIgnoreCase("png")) {
return true;
} else {
return false;
}
}
public String getDescription() {
return "Imagens PNG";
}
});
int resp = jfc.showSaveDialog(this);
if (resp == JFileChooser.CANCEL_OPTION) {
return;
}
File outputFile = jfc.getSelectedFile();
//Salva a imagem (api imageio)
ImageIO.write((BufferedImage) this.img, "PNG", outputFile);
}
/**
* Action para capturar a tela
*
*@author cmsilva (copernico@javafree.com.br)
*@version 19 de Outubro de 2004
*/
private class CapturaAction extends AbstractAction {
/**
* Constructor for the Captura object
*/
public CapturaAction() {
super("Capturar");
}
public void actionPerformed(ActionEvent ev) {
try {
capturar();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Action para salvar a tela
*
*@author cmsilva (copernico@javafree.com.br)
*@version 19 de Outubro de 2004
*/
private class SalvarAction extends AbstractAction {
/**
* Constructor for the SalvarAction object
*/
public SalvarAction() {
super("Salvar");
}
public void actionPerformed(ActionEvent ev) {
try {
salvar();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* MAIN
*
*@param args Description of the Parameter
*/
public static void main(String args[]) {
ScreenCapture app = new ScreenCapture();
app.setSize(640, 480);
app.show();
}
}
Claudio Silva
Curtidas 0
Respostas
João Santos
09/04/2009
Mandou bem. :!:
GOSTEI 0
Grupog3
09/04/2009
Olá amigos , preciso criar um programa tipo o VNC , como poderia relizar a captura da tela e enviar para os clientes ? Existe alguam classe que eu consiga me conectar ao driver de video e redirecionar o fluxo de video para placa de rede ?
GOSTEI 0
Daniel Carrazzoni
09/04/2009
oi!
implementar um server vnc é uma coisa extremanete complicada! o server do vnc é onde tem toda complexidade do negoço. Isso tem a finalidade de deixar o cliente mais leve ;D
www.realvnc.com
pega o server e tem varios fontes de cliente vnc la! inclusive um applet em java ;D
=** beijinhos!
GOSTEI 0
Daniel Carrazzoni
09/04/2009
Então , eu precisaria criar o server e o client , achei uns exemplos utilizando sequencias de printscreen, mas será que nã oexiste uma forma mais viável ???
GOSTEI 0
Daniel Carrazzoni
09/04/2009
Quando executei o exemplo do copernico ficou totalmente impraticavel utilizar sequencias de printscreen pra visualizar as telas
GOSTEI 0
Arian Pasquali
09/04/2009
Ola, grupog3
eu ja fiz um sistema web parecido com VNC em java,
se vc quiser se aventurar em faze um sistema desse tipo eu aconselho, tu aprende pra caralho, eu pelo menos aprendi, implementei servlet, socket e tudo q tem direito, foi muito proveitoso.
tpw, eu nao usei o padrao VNC, foi interessante tenta faze sozinho, eu gosto assim, de inventa do meu jeito, mais como desafio pra aprender mesmo =D
claru q vale a pena primeiro conhecer o que ja existi pronto por aew, neh , mas as vezes vc nao precisa de tanta funcionalidade.
pra acessar os recursos do computador eu utilizei WMI -
[url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_start_page.asp]Windows Management Instrumentation[/url]
atraves de WMI tu pode ate saber a temperatura do processador =D
enfim, tu tem acesso a todos os recursos da maquina de uma forma muito transparente, listar os processos em execução por exemplo eh batata:
loko neh??? isso eh WQL,
[url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/querying_with_wql.asp]Windows Query Language[/url]
isso tudo eh claru se vc for faze baseado no Windows neh, o computador remoto precisa ser windows.
como linux naum eh minha praia eu dexo pra que conhece =P
o sistema q u fiz é mais de visualizacao de informaçao, porem tbm tem a opcao de ver a tela do computador que eh gerada a partir de printscreens. da ate pra controlar o mouse =D, da pra clicar e tudo hehehehe
a parte de faze o print no começo eu não sabia como faze em java e fiz em delphi um executavel q me gerava o print ,bem xunxera, neh??? ehehehehhe
depois eu aprendi como faz em Java, eh o mesmo esquema q o Copernico postou la no começo, usando o pacote ToolKit, o que eu fiquei de cara é a velocidade, o resultado é bem legal.
mas realmente, num da pra fica mandando print toda hora naum....
awe vc manda o print so quando vc interage com a tela, com um clique do mouse por exemplo....
aew tem q ve se vale a pena tu usa a biblioteca pronta do vnc ou ver como ele faz e segui o modelo...eh uma ideia ...
flwww
sds
SELECT * FROM Win32_Process
GOSTEI 0
Arian Pasquali
09/04/2009
pra tirar o printscreen eu utilizei esse codigo aqui, bem parecido com o do Copernico, um pouco mais simples
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ScreenShot {
public static void main(String [] a){
new ScreenShot().atualiza("c:/teste.jpg");
}
public void atualiza(String arquivo){
//tempo de espera
String tempo = "0";
try {
long time = Long.parseLong(tempo) * 1000L;
System.out.println("Waiting " + (time / 1000L) +
" second(s)...");
Thread.sleep(time);
} catch(NumberFormatException nfe) {
System.err.println(tempo + " does not seem to be a " +
"valid number of seconds.");
System.exit(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
Rectangle screenRect = new Rectangle(screenSize);
// criar screenshot
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BufferedImage image = robot.createScreenCapture(screenRect);
try {
ImageIO.write(image, "jpg", new File(arquivo));
System.out.println("Arquivo gerado : "+arquivo);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
GOSTEI 0
Daniel Carrazzoni
09/04/2009
calma la
a complexidade do vnc não é como ele acessa os recursos da maquina ou como ele se conecta. a complexidade ta em saber oque enviar para o cliente e quando enviar.
O vnc não sai dando "print screns" na tela e te mandando tudo ele so te manda aquilo que interessa para aquele cliente e faz toda parte de compactação desses dados para nao perder performance na transmissao!
pq vc axa que mesmo a 56k vc consegue abrir quase que em tempo real imagens de 800x600 ;D
o server do vnc é gratuito e tal e é nele que tem toda complexidade procura no www.realvnc.com que tem a documentacao para implementar um client.
mas se tu conseguir fazer um server melhor que o da turma do vnc manda algunas dicas pra galera la ... que eles não param de pesquisar melhorias =)
:!:
GOSTEI 0
Arian Pasquali
09/04/2009
pode cre daniel,
eu naum to desmerecendo o vnc, na vedade eh exatamente o oposto disso, eu sempre tive muita curiosidade por esse tipo de aplicação.
vc so sabe a real dificuldade de se fazer um negocio qnd vc tenta faze vc mesmo, ou parecido, naum eh verdade???
ta ligado o topico inicial? era sobre screenshots e depois veio o 'grupog3' e falou sobre o projeto "tipo" vnc... por isso eu nao podia dexa de comenta q eu ja tentei faze isso. academicamente foi legal, mas eu naum ia faze nenhum uso comercial do negocio
eu tentei do meu jeito, com os meu xunxo :D
a perforamance naum fico a "aquela" maravilha hehehehehehe
de qualquer forma essa eh uma bela maneira de estudar e ainda valorizar projetos tao interessantes como o realvnc. sentir na pele os problemas q envolve esse tema
agora eu naum sei se o grupo3g esta interessado em desenvolver esse sistema somente pra estudar ou se eh pra trabalho e uso profissional, daew sim, eu concordo plenamente q naum devemos reinventar a roda.
porem se eh pra uso academico eh interessante entender porque os cara fizeram a "roda" assim e naum assado. e uma das formas de se faze isso é tentando faze vc msm.
alem do mais eh interessante vc tentar arquitetar sistemas por vc msm, depois qnd vc olha para projetos prontos a tendencia é q vc saiba identificar melhor onde estao os pontos criticos. aew vc procura saber como foi implementada determinada funcionalidade que vc se bateu tanto =P
bom,como eu disse, acho uma forma interessante de estudar...
sei la o q o cidadao ta pensando em faze com isso...
abraço:!:
GOSTEI 0
Arian Pasquali
09/04/2009
Sei que aqui a praia e java , mas como poderia fazer isto e VB.NET ?
GOSTEI 0
Wallace Souza
09/04/2009
Pequei o código pra tentar fazer um capturador de telas,similar ao software [url=http://www.techsmith.com/camtasia.asp]camtasia[/url],e apartir dele criar uma video do que o usúario fez na tela,usando um software chamado [url=http://ffmpeg.mplayerhq.hu/]ffmpeg[/url] que converte uma sequencia de imagens em um filme *.avi ou mpeg,porém o único problema eh que o código não mostra o mouse no screenshot.
Alguém conseguiu ou tem uma solução pra isso??
GOSTEI 0
Leonardo Oliveira
09/04/2009
Amigo, qual é a classe ou a query WQL que vc usou para pegar a temperatura do processador?
Não consegui esta, e te agradeço se mandar, obrigado.
GOSTEI 0