Web Cam em Swing

Estou precisando armazernar fotos tiradas de um web cam utilizando swing alguém já faz e pode dar uma dica ?
obs: já vi alguns posts mais estão confusos.
Obrigado.

Fiz minha classe WebCamUtil com o DirectShow Java (DSJ para os intimos :slight_smile: ). O DSJ é bem fácil de usar e tem exemplos completos de como implementar.

Vou postar a parte mais importante da minha implementação e anexar ela completa pra você se basear, ok?

[code]public class WebCamUtil extends javax.swing.JDialog{
private static DSCapture player;
private BufferedImage frame;

public WebCamUtil(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    setLocationRelativeTo(null);
    pnlPlayer.setSize(640, 480);
    pnlPlayer.add(player.asComponent());
}

/**
 * Inicia a conexão com a WebCam
 */
public static void iniciarWebCam(){
    try {
        File f = new File("lib\\dsj.dll");
        DSFilterInfo[][] dsi = null;
        try {
            if(f.exists())
                DSEnvironment.setDLLPath(f.getAbsoluteFile().toString());
             dsi = DSCapture.queryDevices();
        } catch (UnsatisfiedLinkError u) {
            JOptionPane.showMessageDialog(null, "O Arquivo \"dsj.dll\" Não Foi Encontrado Em\n"+f.getAbsolutePath().replace("\\dsj.dll", ""),
                                                "Atenção", JOptionPane.ERROR_MESSAGE);
        }
        if(dsi[0][0].getName().equalsIgnoreCase("PC Camera"))
            dsi[0][0].setPreferredFormat(2);
        player = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false, DSFilterInfo.doNotRender(), null);
        player.setSize(640, 480);
        player.stop();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Não Foi Possível Iniciar a WebCam. Possíveis Causas:"
                                            + "\n- O Aplicativo Já Esta Sendo Executado (Gerenciador de Tarefas -> Processos -> javaw.exe)"
                                            + "\n- A WebCam Está Desconectada"
                                            + "\n- O Windows Não Reconheceu a WebCam",
                                            "Atenção", JOptionPane.ERROR_MESSAGE);
    }
}

/**
 * Retorna o frame capturado
 * @return BufferedImage
 */
public BufferedImage getFoto() {
    return frame;
}

/**
 * Redimensiona a foto
 * @param foto
 * @param w
 * @param h
 * @return Image
 */
public static Image resizeFoto(BufferedImage foto, int w, int h){
    return foto.getScaledInstance(w, h, 0);
}

/**
 * Salva a foto e retorna o caminho
 * @param foto
 * @param tipo
 * @return String
 */
public static void salvarFoto(BufferedImage foto, File path){
    try {
        if(!path.exists())
            local.mkdirs();
        ImageIO.write(foto, "PNG", path);
    } catch (IOException e) { }
}

private void btnCapturarActionPerformed(java.awt.event.ActionEvent evt) {
    btnOutra.setEnabled(true);
    btnAceitar.setEnabled(true);
    btnCapturar.setEnabled(false);
    try {
        player.stop();
    } catch (Exception e) { }
        frame = player.getImage();
}

private void btnAceitarActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        player.stop();
    } catch (Exception e) { }
        setVisible(false);
}

private void btnOutraActionPerformed(java.awt.event.ActionEvent evt) {
    btnOutra.setEnabled(false);
    btnAceitar.setEnabled(false);
    btnCapturar.setEnabled(true);
    frame = null;
    btnCapturar.grabFocus();
    try {
        player.play();
    } catch (Exception e) { }
}

private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        player.stop();
    } catch (Exception e) { }
    setVisible(false);
}

private void formWindowActivated(java.awt.event.WindowEvent evt) {
    btnOutra.setEnabled(false);
    btnAceitar.setEnabled(false);
    btnCapturar.setEnabled(true);
    try {
        player.play();
    } catch (Exception e) { }
    btnCapturar.grabFocus();
}

// ...

}[/code]

OBS 1: A classe (anexo) é uma implementação do JDialog. Basta instancia-la que já estará funcionando (teoriacamente :smiley: )
OBS 2: Adicione os arquivos dsj.jar e dsj.dll (download) na pasta lib
OBS 3: OS métodos estáticos resizeFoto() e salvarFoto() podem ajudar

Qualquer dúvida estamos ai!

Legal, outra possibilidade creio que seja usar a JavaCv:
http://code.google.com/p/javacv/

Legal, não conhecia o projeto.
Eu não usaria hoje a JMF. Foi abandonada, é difícil de usar.

Eu sofri bastante com o JMF antes de conhecer o DSJ. Era muita incompatibilidade e o código não era “gatinho” :smiley:

Obrigado vini e adriel, vou implatar a classe depois dou feedback.
Força e Avante.

Só uma pergunta adriel eu posso colocar essas dll dentro do meu projeto, ou tenho que colocar na pasta Java ?

Essa DLL pode ficar na pasta System32 do Windows ou onde você desejar, basta carregá-la pela aplicação.
Se você olhar no método [color=blue]iniciarWebCam()[/color] você vai encontrar as seguintes linhas:

File f = new File("lib\\dsj.dll"); // ... if(f.exists()) DSEnvironment.setDLLPath(f.getAbsoluteFile().toString());
Precisamos carregar a DLL com o [color=blue]DSEnvironment.setDLLPath()[/color], escolhi guardá-la na pasta LIB. Isso fica a seu critério.

A tá massa eim, porque senão na hora de instalar o sistema ficar chato.
Valeu mesmo cara.

tentei implementar mas ta dando o seguinte erro

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at WebCamUtil.(WebCamUtil.java:24)
at WebCamUtil$1.run(WebCamUtil.java:152)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:12
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

não faço a minima ideia o que seja mas espero que seja coisa bouba

Olá amigos tb estou com o mesmo erro.
e agora? :?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at visual.WebCamUtil.<init>(WebCamUtil.java:24)
	at visual.WebCamUtil$1.run(WebCamUtil.java:152)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Estava vendo essa aplicação, o problema do nullpointer Excetion é o

public WebCamUtil(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
iniciarWebCam();//NECESSÁRIO INICIAR A WEBCAM PARA CONSEGUIR USAR OS RECURSOS.
setLocationRelativeTo(null);
pnlPlayer.setSize(640, 480);
pnlPlayer.add(player.asComponent());
}

Ricardo

Vocês chamaram o método estático iniciarWebcam antes do construtor?

Boa noite amigos o meu ficou 100%

Obrigado a todos…

Agora quero implementar um “crop” na foto… :smiley:

meu construtor ficou assim:

public WebCamUtil(java.awt.Frame parent, boolean modal) {
      
        super(parent, modal);
        initComponents();
        setLocationRelativeTo(null);
        iniciarWebCam(); // ESSE É O METODO
        pnlPlayer.setSize(640, 480);
        pnlPlayer.add(player.asComponent());
    }

Galera, o meu deu o seguinte erro:

java.lang.UnsatisfiedLinkError: C:\Users\eliton\Documents\Workspace\APS\APS\lib\dsj.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform, Make sure the dsj.dll is on the library path & DirectX9 and WindowsMediaPlayer 9 or greater are installed

o que pode ser?
Valeuu

dodge, acho que vc deve usar a dsj.dll para 64 … e não a 32.
:slight_smile:

putz era isso mesmo !!! falta de atenção minha!!
valeu pela ajuda cara ^^

Boa Noite pessoal, estou com problema ao usar o código anexo, ele não dá nenhum erro apenas não exibe a imagem da webcam, detalhe quando executa o play ou stop a webcam desliga.

eu uso um not com webcan integrada, pode ser esse o motivo?

preciso muito de ajuda para carregar a imagem.

Galera,

Usei o código acima e com uns pequenos ajustes funcionou beleza, ta salvando as fotos e tudo.

O problema é que a Imagem não aparece no JDialog! É assim mesmo?