Dúvida em capturar foto da webcam com applet

11 respostas
R

Caros,pesquisei aqui no fórum e achei esse tópico semelhante ao problema pelo qual estou passando:
http://www.guj.com.br/java/244280-capturar-imagem-da-webcam-com-uma-applet.

No meu caso,eu uso JSF e a captura está funcionando perfeitamente,no entanto o código só executa na máquina “servidora”,ou seja,se um “cliente” apertar o botão de ‘Capturar’, o frame é renderizado na máquina do servidor,não na do cliente.Como eu posso contornar isso?

11 Respostas

A

estranho cara,

posta seu codigo ai da sua pagina JSF.

t+

R

Trecho que chama o frame:

<h:commandButton 
immediate="true" 
styleClass="buttonAdicionar" 
action="#{visitanteController.abrir(visitanteController.visitante)}" value="Capturar Foto"
rendered="#{visitanteController.visitante.id!=null}"/>

Método do MB:

public void abrir(Visitante vst){
		final Frame f = new Frame("SwingCapture");
		SwingCapture cf = new SwingCapture();
		cf.setVisitante(vst);
		cf.setServidor(pastaServidor);
		cf.setBackup(pastaBackup);
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				SwingCapture.playerclose(f);
				}});
		f.add("Center",cf);
		f.pack();
		f.setSize(new Dimension(600,480));
		f.setVisible(true);
	}

Mas não creio que o problema esteja aqui,pois a funcionalidade está ok;abre o frame e salva a foto no lugar correto.

Acredito que o problema está mais relacionado a politica de segurança,sandbox etc.

A

entao cara,

nao é assim nao, vc deve usar applet, da uma olhada na google como utilizar applet.

e vc vai ter q ver como enviar essa foto capturada no cliente e mandar para o servidor.

t+

R

Alisson,tentei fazer com applet mas ele nem abre o applet no browser,ele pára na linha que instancia o ImagePanel e não acontece mais nada e nem dá erro algum.

Creio que é preciso assinar esse applet,será isso?

Segue o código:

MB:

public void abrir(Visitante vst){
		WebCamCapture c = new WebCamCapture();
		c.init();
	}

Classe do Applet:

package camera;

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() {  
		try {  
		//JOptionPane.showMessageDialog(null, "inicializou");  
		this.setLayout(new BorderLayout());
		this.setSize(220, 220);  
		this.setVisible(true);  
		
		imgpanel = new ImagePanel();  
		capture = new JButton("Capturar Foto");  
		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");  
		
			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:\\teste.jpg";  
		try {  
			ImageIO.write((RenderedImage) imagem, "JPG", 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(120, 120);  
		}  

		public void setImage(Image img) {  
			this.myimg = img;  
			repaint();  
		}  

		public void paint(Graphics g) {  
			if (myimg != null) {  
				g.drawImage(myimg, 0, 0, this);  
			}  
		}  

	}  

}
A

tem sim cara,

da uma olhada nesse link, http://inf.ufrgs.br/gppd/disc/cmp167/trabalhos/sem2001-1/T2/herrmann/

t+

R

Confesso que tô meio perdido com esse lance de assinatura…

Fiz um projeto simples,apenas com uma index.jsp chamando o applet,usando a mesma classe WebCamCapture:

<jsp:plugin code="WebCamCapture.class" codebase="/projetoBase"  type="applet" ></jsp:plugin>

Se assim funcionou,pq dentro do meu projeto não rolou?

A

cara,

eu so usei applet da forma que no final do link q eu te passei, dessa ai q vc ta usando, eu nunca fiz nao.

t+

R

alissonvla:
cara,

eu so usei applet da forma que no final do link q eu te passei, dessa ai q vc ta usando, eu nunca fiz nao.

t+

Conseguiu assinar o applet direitinho?

A

entao cara,

eu fiz so um de teste msm e funcinou, vc vai ter que comprar um certificado digital para assina-lo

t+

R

alissonvla:
entao cara,

vc vai ter que comprar um certificado digital para assina-lo

t+

Tem certeza?Acho q n é preciso não.

A

cara,

para vc testar nao precisa, entao vai ficar aparecendo aquela tela do java no browser, pedindo autorização, pq o certicado é desconhecido e para vc tirar essa tela, vc vai ter que comprar um.

t+

Criado 31 de outubro de 2011
Ultima resposta 1 de nov. de 2011
Respostas 11
Participantes 2