Capture de photos à partir d'une webcam

Soyez le premier à donner votre avis sur cette source.

Snippet vu 48 730 fois - Téléchargée 33 fois

Contenu du snippet

Ca faisait longtemps que je cherchait, mais j'ai enfin trouvé !
Ce code permet de prendre une photos à partir d'une webcam et de l'enregistrer sur votre disque dur. Je met le code tel que je l'ai trouvé (après vérifications, bien entendu).
Je tiens à préciser que ce code n'est pas de moi.

Il y a besoin du JMF ( Java Media Framework ), que l'on peut trouver sur le site de sun : http://java.sun.com/products/java-media/jmf/

Source / Exemple :


import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JButton;
import javax.swing.JComponent;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

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 = new MediaLocator("vfw://0"); 
     
    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");  
    } 
  } 
   
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
jeudi 27 mai 2010
Statut
Membre
Dernière intervention
13 juin 2011

je suis un débutant en java...
ton code ma bcp aidé, je l'ai incorporé dans une applet quand je l'exécute (l'applet) à partir eclipse sa marche et j'arrive même à enregistrer les images sur mon disque dure , mais quand j'exécute à partir d'un navigateur web, le webcam fonctionne mais le premier problème le bouton capture n'enregistre pas les images sur mon disque dure et aussi quand on actualise la page il y a un problème l'applet ne fonctionne pas sa plante, et aussi j'ai essayé de signer l'applet ,mais je ne sais pas utiliser le jar que j'ai généré après avoir signer l'applet, comment déployer ce jar ou l'éxécuter dans une page web?
Messages postés
77
Date d'inscription
lundi 6 mai 2002
Statut
Membre
Dernière intervention
4 mai 2011

pour la jdk 1.6 il faut recrire l appli mais aujourd hui si vous regarde l api media de sun
integre tout cela.
pour l affichage des 2 fenetres je comprends pas ?
Messages postés
5
Date d'inscription
dimanche 16 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2012

Comment faire pour afficher l'image capturée de la webCam sur deux Fenetres ?
Messages postés
6
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
30 janvier 2010

Bonjour et merci pour cette réponse très rapide.
J'utilise JDK 1.6
Donc si tu n'es plus dedans, pas grave je vais essayer de voir autrement.
Merci beaucoup.
Messages postés
56
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
4 janvier 2010

Bonjour Morrissey,

Tu utilise quel version du JDK utilises-tu ?
Quand j'ai fait ce programme je devais utiliser la 1.4, je crois..., mais d'après cette discussion (http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg04226.html) il semblerait qu'effectivement, les classes com.sun.* posent problèmes...
Par contre, ça fait un bail que je ne fait plus de java, alors je ne vais pas pouvoir t'aider plus...

Mageti
Afficher les 77 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.