アプレットでカメラの画像を取り込む。
ん?と思ったけど、ネットで情報を公開して下さってた方がいたので大助かり。
「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(); } }