Applet ou jws que capture imagem da web cam

3 respostas
sarkozy

fala ai

to fazendo um sistema web que tem um modulo onde o usuario passa uns parametros e o sistema captura a imagem da webcam e manda imprimir a imagem capturada junto com os parametros passadoos ao sistema.

entao eu pensei em fazer assim: crio um formulario aonde o usuario passa os parametros e quando um botao for cliicado o sistema abre uma applet. Essa applet recebe os parametros, captura a imagem da web cam e imprime.

o problema:

eu peguei um codigo de exemplo na internet que captura a imagem da webcam utilizando o JMF. Redei a applet pelo eclipse mesmo e funcionou certinho, mas quando eu criei um html chamando essa applet, ele inicia a applet, mas ela nao termina de carregar... da pau!

alguem tem ideia do que seja?

seria melhor eu usar applet mesmo ou o Java Web Start?

meu codigo applet:

import java.applet.Applet;  
    import java.awt.BorderLayout;  
    import java.awt.Component;  
    import java.awt.Graphics;  
    import java.awt.Image;  
    import java.awt.Panel;  
    import java.awt.event.ActionEvent;  
    import java.awt.event.ActionListener;  
    import java.awt.image.RenderedImage;  
    import java.io.File;  
    import java.io.IOException;  
      
    import javax.imageio.ImageIO;  
    import javax.media.Buffer;  
    import javax.media.CaptureDeviceInfo;  
    import javax.media.Manager;  
    import javax.media.MediaLocator;  
    import javax.media.Player;  
    import javax.media.cdm.CaptureDeviceManager;  
    import javax.media.control.FrameGrabbingControl;  
    import javax.media.format.VideoFormat;  
    import javax.media.util.BufferToImage;  
    import javax.swing.JButton;  
    import javax.swing.JComponent;  
    import javax.swing.JOptionPane;  
      
      
      
    public class WebCamCapture extends Applet implements ActionListener {  
      
        private static final long serialVersionUID = 1L;  
        public static Player player = null;  
        public CaptureDeviceInfo di = null;  //  @jve:decl-index=0:  
        public MediaLocator ml = null;  //  @jve:decl-index=0:  
        public JButton capture = null;  
        public Buffer buf = null;  
        public Image img = null;  
        public VideoFormat vf = null;  
        public BufferToImage btoi = null;  
        public ImagePanel imgpanel = null;  
      
        public void init() {  
            JOptionPane.showMessageDialog(null, "inicializou");  
            this.setLayout(new BorderLayout());  
            this.setSize(320, 550);  
            this.setVisible(true);  
            imgpanel = new ImagePanel();  
            capture = new JButton("Capture");  
            capture.addActionListener(this);  
      
            // This may differ check the jmf registry for  
            // correct entry  
            String str2 = "vfw//0";  
            di = CaptureDeviceManager.getDevice(str2);  
            ml =  new MediaLocator("vfw://0");  
            JOptionPane.showMessageDialog(null, "executou di e ml");  
            try {  
                player = Manager.createRealizedPlayer(ml);  
                player.start();  
                Component comp;  
                if ((comp = player.getVisualComponent()) != null) {  
                    add(comp, BorderLayout.NORTH);  
                }  
                add(capture, BorderLayout.CENTER);  
                add(imgpanel, BorderLayout.SOUTH);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
      
        public void paint(Graphics g) {  
      
        }  
      
        public static void playerclose() {  
            player.close();  
            player.deallocate();  
        }  
      
        public void actionPerformed(ActionEvent e) {  
            JComponent c = (JComponent) e.getSource();  
            if (c == capture) {  
                // Grab a frame  
                FrameGrabbingControl fgc = (FrameGrabbingControl) player  
                        .getControl("javax.media.control.FrameGrabbingControl");  
                buf = fgc.grabFrame();  
      
                // Convert it to an image  
                btoi = new BufferToImage((VideoFormat) buf.getFormat());  
                img = btoi.createImage(buf);  
                // show the image  
                imgpanel.setImage(img);  
                gravaImg(img);  
            }  
        }  
      
        public void gravaImg (Image imagem){  
            String caminho = "C:\\Documents and Settings\\Patrick\\Desktop" +  
                    "\\PontoEletronico\\Fotos\\Patrick1.jpg";  
            try {  
                ImageIO.write((RenderedImage) imagem, "PNG", new File(caminho));  
            } catch (IOException e) {  
                JOptionPane.showMessageDialog(null, "não foi possivel encontrar " +  
                        "o dispositivo para a captura da imagem.");  
                e.printStackTrace();  
            }  
              
        }  
      
      
        class ImagePanel extends Panel {  
      
            private static final long serialVersionUID = 1L;  
            public Image myimg = null;  
      
            public ImagePanel() {  
                JOptionPane.showMessageDialog(null, "setando a classe");  
                setLayout(null);  
                setSize(320, 240);  
            }  
      
            public void setImage(Image img) {  
                this.myimg = img;  
                repaint();  
            }  
      
            public void paint(Graphics g) {  
                if (myimg != null) {  
                    g.drawImage(myimg, 0, 0, this);  
                }  
            }  
      
        }  
      
    }

html que chama a applet:

<html>
<body>
<applet code=WebCamCapture.class width="200" height="200" >
</applet>
</body>
</html>

3 Respostas

discorpio

Boa noite Sarkozy.

Existem certas restrições de segurança ao se carregar um Applet de um servidor remoto, eis que existem usuários mal intencionados podem configurar a mesma para invadir computadores, assim sendo foi criado um aplicativo chamado “Policytool” que se encontra na pasta C:\Arquivos de programas\Java\jdk1.7.0\bin, este configura as restrições ou permissões que sua applet possa executar. Procure ler sobre segurança com Applets e o conceito sobre caixa de areia (Sand box).

Além disso, existem os problemas de conflitos de códigos e plugins entre navegadores, além das diversas versões do JDK do java, que também não se adequam a certos navegadores, que muita das vezes impossibilitam a applet de executar.

Por tudo acima exposto, eu te recomendaria voce utilizar o Web Start, isto pois, com ele, voce executa a applet fora do navegador de internet, é pode inclusive publicar uma aplicação desktop, tal qual baixá-la ou executá-la via Web, o que já é um avanço, bastando tão somente voce configura as permissões de segurança no Policytool.

Se voce faz o seu desenvolvimento no NetBeans, ele se encarrega de fazer isto pra voce, desde que sejam nas versões 7, e voce ao clicar com o botão direito no nome do projeto na caixa de ferramenta projeto, e em propriedades, na caixa categorias, ir no item aplicativo e Web Start, ali voce já configura tudo, inclusive as permissões do mesmo.

Um abraço

sarkozy

Mto boa sua explicação amigo. Foi de grande elucidação!

Vou usar o Java web start!

so queria saber uma coisa, existe como passar parametros do meu sistema web para o aplicativo web start e vice-versa?

obrigado!

discorpio

Boa noite Sarkozy.

Até onde eu sei, não é possível, contudo como o Web Start permite também a utilização de Applets, caso voce tenha feito a implementação com uma Window tal como JFrame, voce pode passar os parâmetros para uma Applet e instaciar o JFrame dentro da Applet, onde, ao receber os parâmetros na Applet, a Applet passa os seus valores para o JFrame, através de métodos setters.

Outra coisa que eu reparei, é que voce está usando Java Media Framework (JMF), que já se encontra obsoleto.

O melhor é utilizar o Direct Show Java (DJS). Dê uma olhada nos links abaixo:

http://www.humatic.de/htools/dsj.htm
http://www.s2i.com.br/2011/04/14/gravando-videos-com-o-dsj-direct-show-java/

Para download:
http://www.humatic.de/htools/dsj/download.htm

Um abraço

Criado 15 de julho de 2011
Ultima resposta 16 de jul. de 2011
Respostas 3
Participantes 2