S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

JavaでPCカメラ

アプレットでカメラの画像を取り込む。
ん?と思ったけど、ネットで情報を公開して下さってた方がいたので大助かり。
vfw://0」でUSBなんか?複数あったらどうなるんじゃ?
とか思いながら、とりあえず
・カメラのリアルタイム映像を表示
・ボタンを押した瞬間の静止画を表示
・その静止画を画像ファイルで保存
ができた。
動画をストリームで保存みたいなのもできるのね。


■参考サイト
Javaの道 > 掲示板 > 回答(USBカメラをJAVAで制御)
http://www.javaroad.jp/bbs/answer.jsp?q_id=20050809152813610
JMFでビデオキャプチャ
http://www.media.t-kougei.ac.jp/~nagae/java/jmf/
AVIファイルのプレビューを作る。
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/diary/200306.html#21


import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.io.File;
import java.io.FileOutputStream;

import javax.media.Buffer;
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.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class PcCamera {

    
    private static final long serialVersionUID = -3395060461579429390L;
    
    private JFrame scrFrame = null; 
    private JPanel scrPanel =  null;
    
    private Player scrPlayer = null;
    private JButton scrButton = null;
    private JButton scrFixButton = null;
    
    private JFrame scrImgFrame = null; 
    private ImgPanel scrImgPanel =  null;

    private Image img = null;    
    
    
    public PcCamera() {
        super();
        getFrame().setVisible(true);
        getFrame().setResizable(false);
        getFrame().setLocation(new Point(0, 0));
        getImgFrame().setVisible(true);
        getImgFrame().setResizable(false);
        getImgFrame().setLocation(new Point(320, 0));
    }
    
    public static void main(String [] args) {
        new PcCamera();
    }
    
    
    private JFrame getFrame() {
        if (scrFrame == null) {
            scrFrame = new JFrame();
            scrFrame.setSize(new Dimension(320, 320));
            scrFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            scrFrame.setTitle("PC Camera Test");
            scrFrame.setContentPane(getPanel());
        }
        return scrFrame;
    }
    
    
    private JPanel getPanel() {
        if (scrPanel == null) {
            scrPanel = new JPanel();
            scrPanel.setLayout(null);
            scrPanel.add(getPlayer().getVisualComponent(), null);
            scrPanel.add(getButton(), null);
            scrPanel.add(getFixButton(), null);
        }
        return scrPanel;
    }
    
    
    private Player getPlayer() {
        if (scrPlayer == null) {
            try {
                scrPlayer = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
                scrPlayer.getVisualComponent().setLocation(new Point(0, 0));
                scrPlayer.getVisualComponent().setSize(new Dimension(320, 240));
                scrPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return scrPlayer;
    }
    
    
    private JButton getButton() {
        if (scrButton == null) {
            scrButton = new JButton();
            scrButton.setLocation(new Point(20, 250));
            scrButton.setText("撮影");
            scrButton.setFont(new Font("Dialog", Font.PLAIN, 12));
            scrButton.setSize(new Dimension(150, 20));
            scrButton.setEnabled(true);
            scrButton.addActionListener(new java.awt.event.ActionListener() {
                
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    scrButton.setEnabled(false);
                    copyImage();
                       getImgPanel().repaint();
                    scrButton.setEnabled(true);
                    getFixButton().setEnabled(true);
                }
                
            });
            
        }
        return scrButton;
    }
    
    
    private JButton getFixButton() {
        if (scrFixButton == null) {
            scrFixButton = new JButton();
            scrFixButton.setLocation(new Point(190, 250));
            scrFixButton.setText("確定");
            scrFixButton.setFont(new Font("Dialog", Font.PLAIN, 12));
            scrFixButton.setSize(new Dimension(100, 20));
            scrFixButton.addActionListener(new java.awt.event.ActionListener() {
                
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    try {
                        byte [] binary = encodeJpeg(img);
                        FileOutputStream os = new FileOutputStream(new File("c:/test.jpg"));
                        os.write(binary);
                        os.flush();
                        os.close();
                    } catch (Exception ex) {
                
                    }
                }
                
            });
            
        }
        return scrFixButton;
    }
    
    
    private void copyImage() {
        FrameGrabbingControl frameGrabber
            = (FrameGrabbingControl) getPlayer().getControl("javax.media.control.FrameGrabbingControl");
        Buffer buf = frameGrabber.grabFrame();
        BufferToImage b2i = new BufferToImage((VideoFormat) buf.getFormat());
        img = b2i.createImage(buf);
        getImgPanel().setImage(img);
    }
    
    
    private JFrame getImgFrame() {
        if (scrImgFrame == null) {
            scrImgFrame = new JFrame();
            scrImgFrame.setSize(new Dimension(320, 275));
            scrImgFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            scrImgFrame.setTitle("Picture");
            scrImgFrame.setContentPane(getImgPanel());
        }
        return scrImgFrame;
    }
    
    
    private ImgPanel getImgPanel() {
        if (scrImgPanel == null) {
            scrImgPanel = new ImgPanel(img);
            scrImgPanel.setLayout(null);
        }
        return scrImgPanel;
    }

    
    private class ImgPanel extends JPanel {

        private static final long serialVersionUID = -3372158402246017927L;
        
        private Image image = null;
        
        private ImgPanel(Image image) {
            this.image=image;
            this.setPreferredSize(new Dimension(30, 240));
            this.invalidate();
        }
        
        public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(image, 0, 0, this);
            this.setOpaque(true);
        }
        
        public void setImage(Image image) {
            this.image=image;
        }
        
    }


    private byte [] encodeJpeg(final Image image) throws IOException {

        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(image, null, null);
        
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(os);
        
        JPEGEncodeParam jpegParam = jpegEncoder.getDefaultJPEGEncodeParam(bufferedImage);
        jpegParam.setQuality(1.0f, false);
        jpegEncoder.setJPEGEncodeParam(jpegParam);
        
        jpegEncoder.encode(bufferedImage);
        
        os.flush();
        os.close();
        
        return os.toByteArray();
        
    }


}