将网上的Java调用摄像头代码整理后如下,但为什么拍好后总是一片黑,什么都没有?请高手帮忙看下,谢谢..
- Java code
package com.xie.can;import java.awt.BorderLayout;import java.awt.Component;import java.awt.Graphics2D;import java.awt.Image;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.JApplet;import javax.swing.JButton;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;class CanTest extends JApplet{ public static Player player = null; private CaptureDeviceInfo di = null; private MediaLocator ml = null;// 文档中提供的驱动写法,为何这么写我也不知:) public void init() { 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); } } catch (Exception e) { e.printStackTrace(); } }}class Pai{ private JButton capture; private Buffer buf = null; private BufferToImage btoi = null; private ImagePanel imagpanel = null; private Image img = null; private ImagePanel imgpanel = null; public void pi() {// JComponent c = (JComponent) e.getSource();// if (c == capture)//如果按下的是拍照按钮 // { imgpanel = new ImagePanel(); FrameGrabbingControl fgc =(FrameGrabbingControl)CanTest.player.getControl("javax.media.control.FrameGrabbingControl"); buf = fgc.grabFrame(); // 获取当前祯并存入Buffer类 btoi = new BufferToImage((VideoFormat) buf.getFormat()); img = btoi.createImage(buf); // show the image imgpanel.setImage(img);// } }}class ImagePanel extends JApplet{ public void setImage(Image img) { int imgWidth = 200 , imgHeight = 300; //BufferedImage bi = (BufferedImage)createImage(imgWidth, imgHeight); BufferedImage bi = new BufferedImage(800,600,BufferedImage.TYPE_INT_BGR); //System.out.println(bi); Graphics2D g2 = bi.createGraphics(); g2.drawImage(img, null, null); String s = "c:/1.jpg"; FileOutputStream out = null; try { out = new FileOutputStream(s); } catch (java.io.FileNotFoundException i) { System.out.println("File Not Found"); } JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi); param.setQuality(1f, false);//不压缩图像 encoder.setJPEGEncodeParam(param); try { encoder.encode(bi); out.close(); } catch (java.io.IOException io) { System.out.println("IOException"); } }}public class Main{ public static void main(String[] args) { CanTest ct = new CanTest(); Pai p = new Pai(); ct.init(); p.pi(); }}
------解决方案--------------------
我有几个代码,可以成功调用摄像头,是用C++和Java来做的,我做了点点修改
需要的话给我发邮件,交个朋友
csdxqzp@163.com