2014年11月28日 星期五

[Java] Java 開啟WebCam的拍照方法(1)— JMF

Java Media Framework(JMF) 

JMF 是Java的一個library ,並不包含在Java SE 中 ,需要另外下載安裝。

JMF 的出現使得JAVA可以實現 audio(音訊), video (視訊) 

以及其他 time-based media 相關應用。

安裝JMF

1.JMF下載網址(你必須要先裝JAVA SE)
http://www.oracle.com/technetwork/java/javase/download-142937.html
















如果是windwos,十分建議安裝Windwos Perfomace Pack,也可以選擇下載Cross-paltform Java 跨平台版本。
雖然上面沒有寫Mac OS專用的,但你依然可以Cross-paltform Java .



在windows上如果無論如何都無法取得webcam裝置,可以試試看下圖中的方式, 按下去後視訊的燈有可能會閃爍一分鐘左右. 或是使用系統管理員身份執行C:\Program Files (x86)\JMF2.1.1e\bin\jmfinit.exe .





接下來是一個重點,記住下圖黃色標註Name=後面的地方,名字可能會不同,本例為

vfw: Microsoft WDM Image Capture (Win32):0




















程式碼如下:


import java.awt.Component;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.media.Buffer;
import javax.media.CannotRealizeException;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
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.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Demo {

    private JFrame JF;
    private static Player webcamplayer = null;
    private CaptureDeviceInfo webcamDI = null;
    private MediaLocator ml = null;
    private Component visual;
    private JButton take;
    public Buffer buf = null;
    public BufferToImage bufferimage = null;

    /**
     * 預設建構子
     */
    public Demo() {
        initSwing();
        initWebcam();
        startWebCam();
        JF.setVisible(true);
    }

    /**
     * *
     * Initial the Swing
     */
    private void initSwing() {
        //get Screen size
        int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        //Initial and Setting JFrame
        JF = new JFrame("WebCamDemo");
        JF.setLayout(null);
        JF.setBounds(0, 0, w, h);
        JF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        take = new JButton("Take a picture");
        take.setBounds(10, 10, 300, 100);
        JF.add(take);
        take.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JComponent c = (JComponent) e.getSource();

                if (c == take) {
                    // Grab a frame
                    FrameGrabbingControl fgc = (FrameGrabbingControl) webcamplayer
                            .getControl("javax.media.control.FrameGrabbingControl");
                    buf = fgc.grabFrame();

                    // Convert it to an image
                    bufferimage = new BufferToImage((VideoFormat) buf.getFormat());
                    Image img = bufferimage.createImage(buf);
                    try {
                        ImageIO.write((RenderedImage) img, "JPG",
                                new File("take.jpg"));
                        JOptionPane.showMessageDialog(null, "已拍照");
                    } catch (IOException ex) {
                    }
                }
            }
        });
    }

    /**
     * /Initial webcam Device
     */
    private void initWebcam() {
        //Webcam Driver name
        String webcamdriver = "vfw:Microsoft WDM Image Capture (Win32):0";
        //get webcam Device Info
        webcamDI = CaptureDeviceManager.getDevice(webcamdriver);

        //Locator the Media data
        ml = webcamDI.getLocator();
        webcamDI = CaptureDeviceManager.getDevice(webcamdriver);
        //Initial webcamplayer
        try {
            webcamplayer = Manager.createRealizedPlayer(ml);
            //get a  visual component
            visual = webcamplayer.getVisualComponent();

            JF.add(visual);

            visual.setBounds(10, 100, 640, 480);
            visual.setVisible(false);
        } catch (NoPlayerException | CannotRealizeException | IOException e) {
        }
    }

    /**
     * Start WebCam
     */
    private void startWebCam() {
        //start to get webcam data
        webcamplayer.start();
        //visual display now   
        visual.setVisible(true);
    }

    /**
     * Main Function
     *
     * @param args
     */
    public static void main(String args[]) {
        Demo hw1 = new Demo();
    }
}


程式碼中有一行
String webcamdriver = "vfw:Microsoft WDM Image Capture (Win32):0";

就是要開啟WebCamb的名稱。

最後執行結果如下:












按下拍照後

檢視目錄可以發現我們剛拍下的take.jpg
看一下照片






其實還有可以用取得裝置列表的方式來取得WebCam,本篇僅用一個最簡單的方式來呈現。

感謝看倌們不嫌棄。

沒有留言:

張貼留言