2009-12-05 5 views
0

웹캠에서 이미지를 캡처하려면 jmf를 사용하고 있습니다. 웹캠에 연결되어 있으며 정상적으로 작동하고 있습니다. 나는 웹캠에서 이미지를 캡처하려면 다음 코드를 사용하고 있습니다 : -웹캠에서 이미지 캡처

import com.sun.image.codec.jpeg.JPEGCodec; 
    import com.sun.image.codec.jpeg.JPEGEncodeParam; 
    import com.sun.image.codec.jpeg.JPEGImageEncoder; 
    import java.awt.Color; 
    import java.awt.Font; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.Image; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.geom.AffineTransform; 
    import java.awt.image.BufferedImage; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.util.Date; 
    import java.util.Iterator; 
    import java.util.Vector; 
    import javax.media.Buffer; 
    import javax.media.CannotRealizeException; 
    import javax.media.CaptureDeviceInfo; 
    import javax.media.CaptureDeviceManager; 
    import javax.media.Manager; 
    import javax.media.NoPlayerException; 
    import javax.media.Player; 
    import javax.media.control.FrameGrabbingControl; 
    import javax.media.format.VideoFormat; 
    import javax.media.util.BufferToImage; 
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import javax.swing.SwingUtilities; 
    import javax.swing.Timer; 

public class FrameGrab extends JPanel implements ActionListener { 
    private Player player = null; 

    private BufferedImage buffImg = null; 

    private Timer timer; 

    private FrameGrabbingControl frameGrabber; 

    public FrameGrab() { 
     // Create capture device 
     Vector devices = CaptureDeviceManager.getDeviceList(null); 
     CaptureDeviceInfo cdi = null; 
     for (Iterator i = devices.iterator(); i.hasNext();) { 
      cdi = (CaptureDeviceInfo) i.next(); 
      /* Get the first Video For Windows (VFW) capture device. 
      * Use the JMF registry tool in the bin directory of the JMF 
      * distribution to detect available capture devices on your 
      * computer. 
      */ 
      if (cdi.getName().startsWith("vfw:")) 
       break; 
     } 
     // start the Timer with 3s intervals 
     new Timer(2000, this).start(); 
     try { 
      player = Manager.createRealizedPlayer(cdi.getLocator()); 
      player.start(); 
     } catch (NoPlayerException e) { 
      e.printStackTrace(); 
     } catch (CannotRealizeException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     // Grab a frame from the capture device 
     frameGrabber = (FrameGrabbingControl) player 
       .getControl("javax.media.control.FrameGrabbingControl"); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (buffImg != null) { 
      g.drawImage(buffImg, 0, 0, this); 
     } 
    } 

     private void writeImagetoFile(BufferedImage img,String aFileName,int width,int height,double quality) 
     { 
      try{ 
      FileOutputStream fos = new FileOutputStream(aFileName); 
      JPEGImageEncoder encoder2 =JPEGCodec.createJPEGEncoder(fos); 
      JPEGEncodeParam param2 = encoder2.getDefaultJPEGEncodeParam(img); 
      param2.setQuality((float) quality, true); 
      encoder2.encode(img,param2); 
      fos.close(); 
      }catch(Exception ex){} 
     } 
    private void grab() { 
      Buffer buf=null; 

      try{ 
       Thread.sleep(2000); 
     buf = frameGrabber.grabFrame(); 
      }catch(Exception ex){ex.printStackTrace();} 
     // Convert frame to an buffered image so it can be processed and saved 
     Image img = (new BufferToImage((VideoFormat) buf.getFormat()) 
       .createImage(buf)); 
     buffImg = new BufferedImage(img.getWidth(this), img.getHeight(this), 
       BufferedImage.TYPE_INT_RGB); 
       writeImagetoFile(buffImg,"c:/image.jpg",100,100,100); 
     Graphics2D g = buffImg.createGraphics(); 
     g.drawImage(img, null, null); 
     g.setColor(Color.darkGray); 
     g.setFont(new Font("Tahoma", Font.PLAIN, 12) 
       .deriveFont(AffineTransform.getRotateInstance(1.57))); 
     g.drawString((new Date()).toString(), 5, 5); 
    } 

    public static void createAndShowGui() { 
     JFrame frame = new JFrame("Frame Grabber"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new FrameGrab()); 
     frame.setSize(328, 270); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) 
    */ 
    public void actionPerformed(ActionEvent e) { 
     grab(); 
     repaint(); 
    } 
} 

을 내가 예외 다음 무엇입니까이 프로그램을 실행하면 :이 같은 예외를 생성하는 이유

java.lang.NullPointerException 
     at writepdffile.FrameGrab.grab(FrameGrab.java:99) 
     at writepdffile.FrameGrab.actionPerformed(FrameGrab.java:137) 
     at javax.swing.Timer.fireActionPerformed(Timer.java:271) 
     at javax.swing.Timer$DoPostEvent.run(Timer.java:201) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at writepdffile.FrameGrab.grab(FrameGrab.java:102) 
     at writepdffile.FrameGrab.actionPerformed(FrameGrab.java:137) 
     at javax.swing.Timer.fireActionPerformed(Timer.java:271) 
     at javax.swing.Timer$DoPostEvent.run(Timer.java:201) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

내가 점점 아니에요 .. 제발 좀 도와주세요, 나는 jfm으로 최신입니다. 당신이 NullPointerException의 문제에 직면하는 경우 JMF의 레지스트리를 통해 구성하지 않은 경우

답변

1

괜찮 사전에

덕분에,이 문제가 발생합니다. Windows 용 jmf를 설치할 때 jmf 등록 응용 프로그램이 관련되어 있습니다. 열어서 설정을 선택하고 캡처 장치를 선택해야합니다. 장치가 과 같은 vfw (Windows 용 비디오)로 시작한 다음 커밋하면 마지막 단계입니다.

나는 이미 jmf.jar 및 기타 jar 파일이 들어있는 jmf의 lib 폴더에 classpath를 설정했다고 생각합니다. 그런 다음 정상적으로 jmf 프로그램을 실행할 수 있습니다. 문제가 생기면 알려주세요