Проблемы с доступом к веб-камере - PullRequest
0 голосов
/ 30 марта 2010

Я написал код на Java для доступа к веб-камере и сохранения изображения ... Я получаю следующие исключения: Исключение в потоке "main" java.lang.NullPointerException в SwingCapture. (SwingCapture.java:40) в SwingCapture.main (SwingCapture.java:66)

как убрать это исключение.

вот код:

import javax.swing.*;

import javax.swing.event. ; импорт java.io. ; импорт javax.media. ; импорт javax.media.format. ; import javax.media.util. ; импорт javax.media.control. ; импорт javax.media.protocol. ; import java.util. ; импорт java.awt. ; import java.awt.image. ; import java.awt.event. ; import com.sun.image.codec.jpeg. ;

открытый класс SwingCapture расширяет Panel реализует ActionListener { public static Player player = null; public CaptureDeviceInfo di = null; public MediaLocator ml = null; public JButton capture = null; public Buffer buf = null; общедоступное изображение img = null; public VideoFormat vf = null; public BufferToImage btoi = null; public ImagePanel imgpanel = null;

public SwingCapture () { setLayout (new BorderLayout ()); SetSize (320550);

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


String str1 = "vfw:iNTEX IT-308 WC: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 []) { 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,"\test.jpg");
}

}

класс ImagePanel расширяет панель { общедоступное изображение 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);
  }
}

}

публичная статическая пустота saveJPG (изображение, строки) { 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"); 
}

}

} * * тысяча пятьдесят-один

Ответы [ 3 ]

0 голосов
/ 30 марта 2010

Если вы используете встроенную веб-камеру, большую часть времени она показывает ошибки. Вы можете попробовать с внешней веб-камерой.

0 голосов
/ 20 апреля 2010

У меня есть модель веб-камеры ENTER: E-1.3MPIR, что должно быть аргументом для CaptureDeviceManager.getDevice ()

0 голосов
/ 30 марта 2010

Ваш код несколько запутан, но вы обязательно указали, что в вашем фрейме установлен набор границы? Я прошел через эту проблему много раз. Попробуйте явно указать this.Layout = new BorderLayout () ;. Если проблема не исчезнет, ​​дайте мне знать, и я постараюсь помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...