[SOLUCIONADO]Tomar una foto desde una webcam

Iniciado por ZeroVzla, 23 Febrero 2010, 17:44 PM

0 Miembros y 2 Visitantes están viendo este tema.

ZeroVzla

Hola a todos, de ante mano muchas gracias por tomarse la molestia de leer este post...

Estoy creando una aplicacion en java que por dadas causas necesita tomar una foto desde una camara web u otro tipo de camara que se conecte a la pc. El problema es que no tengo ni la mas remota idea de como hacerlo, si pudieran guiarme un poco en este tema (utilizar la camara web u otro tipo de camara en java) se los agradeceria con el alma :D..

Muchas Gracias!!!



ZeroVzla

  
  Ya resolvi xD... y por si alguien quiere saber como tomar la foto les dejo este codigo (que no es mio por si acaso) a fin de contribuir con algo :D

Primero deben descargar e instalar el JMF siguiendo este enlace:
http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html

   Luego ya pueden ejecutar el codigo:

Código (java) [Seleccionar]

import javax.swing.*;
import java.io.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import com.sun.image.codec.jpeg.*;

public class SwingCapture extends Panel implements ActionListener
{
 public static Player player = null;
 public CaptureDeviceInfo di = null;
 public MediaLocator ml = null;
 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 SwingCapture()
 {
   setLayout(new BorderLayout());
   setSize(320,550);

   imgpanel = new ImagePanel();
   capture = new JButton("Capture");
   capture.addActionListener(this);

   String str1 = "vfw:Logitech USB Video Camera:0";
   String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
   di = CaptureDeviceManager.getDevice(str2);
   ml = di.getLocator();

   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 static void main(String[] args)
 {
   Frame f = new Frame("SwingCapture");
   SwingCapture cf = new SwingCapture();

   f.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
     playerclose();
     System.exit(0);}});

   f.add("Center",cf);
   f.pack();
   f.setSize(new Dimension(320,550));
   f.setVisible(true);  
   
 }
 

 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);

     // save image
     saveJPG(img,"c:\\test.jpg");
   }
 }

 class ImagePanel extends Panel
 {
   public Image myimg = null;

   public ImagePanel()
   {
     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);
     }
   }
 }

 public static void saveJPG(Image img, String s)
 {
   BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
   Graphics2D g2 = bi.createGraphics();
   g2.drawImage(img, null, null);

   FileOutputStream out = null;
   try
   {
     out = new FileOutputStream(s);
   }
   catch (java.io.FileNotFoundException io)
   {
     System.out.println("File Not Found");
   }

   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
   JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
   param.setQuality(0.5f,false);
   encoder.setJPEGEncodeParam(param);

   try
   {
     encoder.encode(bi);
     out.close();
   }
   catch (java.io.IOException io)
   {
     System.out.println("IOException");
   }
 }

}


Ha y por si quieren saber el nombre de su dispositivo o camara web aqui les dejo un metodo que se los muestra ( este si lo hice yo xD.. )

Código (java) [Seleccionar]

public void devices(){
   Vector devices = new Vector (CaptureDeviceManager.getDeviceList(null));
   for(int i=0;i<devices.size();i++)
   System.out.println(devices.elementAt(i));
 }


Bueno Saludos!!!!! Por cierto ya es obvio que se puede cerrar el tema :D

Amerikano|Cls





Mi blog:
http://amerikanocls.blogspot.com

ZeroVzla

Citar
JavIut

Hola amigo probe tu codigo pero no logro conseguir o no logra conseguir ningun Capture Device ya he instalado JMF y incluso lo he usado el programa y funciona y toma video y todo.. y he visto que acepta lo siguiente
Name = vfw:Microsoft WDM Image Capture (Win32):0

Locator = vfw://0

Output Formats---->

pero cuando lo uso en el codigo me dice que no existe.. y monto los devices y no me muestra ninguno me puedes dar un clue.. Christian Ortiz Vzla



Hola broht..

Mmmmm bueno no entendi muy bien  :huh:.... Cuando dices que haz usado el programa y funciona t refieres a que con el codigo que esta en el foro si se ve el video y toma la foto????

"no logro conseguir o no logra conseguir ningun Capture Device"?? t refieres a que la salida de metodo devices sólo t devuelve Name = vfw:Microsoft WDM Image Capture (Win32):0??

"pero cuando lo uso en el codigo me dice que no existe.. "?? cuando lo usas en el codigo de tu programa??????

"y monto los devices y no me muestra ninguno"?? t refieres a que conectas la cámara a tu computador??..

Por favor se un poco mas específico :D...

Ahora bien, y sin animos de ofender tus conocimientos, debes tener el driver de la camara instalado aparte del JMF. Otra cosa el metodo "devices()" t muestra los controladores de video pero la salida "vfw:Microsoft WDM Image Capture (Win32):0" se refiere al controlador universal de windows, lo que quiere decir que puedes utilizar este para conectarte con la webcam, que de echo es con ese que se conecta el codigo del post..

Seria bueno que me mandaras la salida del metodo "devices()" :D.. al igual que tu codigo a ver si podemos resolver xD... Tambien recuerda que estamos en un foro y que tu problema le puede surgir a otra persona, y si resolvemos solo por los mp's los demas no podrán ver la solución, por eso lo voy a poner como respuesta al post y por alli deberias postear lo que t pedi....

Bueno un saludo broth.. See us!!!!  ZeroVzla....

Debci

Sensacional tengo algo parecido que use en mi troyano...

Jejeje sed buenos...

Saludos

ZeroVzla

Mmmmm capturar la imagen de la webcam remota con ese no se puede xD... ya que depende del JMF... Sería interesante ver como hicistes :D...

Saludos.. See us!! ZeroVzla...

Debci

Cita de: ZeroVzla en 19 Junio 2010, 01:09 AM
Mmmmm capturar la imagen de la webcam remota con ese no se puede xD... ya que depende del JMF... Sería interesante ver como hicistes :D...

Saludos.. See us!! ZeroVzla...
Como que no?
Sencillamente en el programa servidor en el pc victima, realiza la captura y transforma la imagen en una matriz de datos tipo byte y la transfieres por stream, asi de sencillo.


Y comentarte tambien que se pueden incluir las libs dentro del mismo jar para compactarlo todo.

Saludos

ZeroVzla

Mmmm....  Ok lo de enviar la imagen si lo pude digerir xD... pero como harias para capturar la imagen sin el JMF instalado????

Debci

Cita de: ZeroVzla en 25 Junio 2010, 05:29 AM
Mmmm....  Ok lo de enviar la imagen si lo pude digerir xD... pero como harias para capturar la imagen sin el JMF instalado????
Siempre puede generar el servidor con la libreria integrada, o subirla despues y ejecutarla, por algo es un troyano.

Saludos

ZeroVzla

Mmmmm.. si bueno... xD... es que tenia la duda de que si se debia instalar obligado el prog en la maquina porque una vez utlice en mi prog una libreria para manejar puertos seriales y si lo ejecutaba desde el compilador todo fino, pero si generaba el jar con todo y librerias incluidas en el y lo ejecutaba me daba error porque no agarraba esa libreria.. tenia que pasar la libreria al system32 de windows en ese caso en particular y asi si corria.. igual tal vez era sólo mi ignorancia aflorando xD.. jeje...