日期:2014-05-20  浏览次数:20735 次

java调用摄像头问题
将网上的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