RSi package sample.rsnp2x.multi; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.media.Buffer; import javax.media.CannotRealizeException; 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.JFrame; import javax.swing.JPanel; /** * カメラの画像のキャプチャを行なうクラス<br> * JMFで実装 * */ public class ImgCapture { /** * JMFプレイヤ */ private Player player = null; private static ImgCapture imgCapture = null; public static ImgCapture getInstance() { if (imgCapture == null) { try { imgCapture = new ImgCapture(); } catch (NoPlayerException e) { e.printStackTrace(); } catch (CannotRealizeException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return imgCapture; } /** * コンストラクタ * * @param dir * 画像の保存ディレクトリ * @param fileFormat * 画像のファイルフォーマット * @throws IOException * @throws CannotRealizeException * @throws NoPlayerException */ private ImgCapture() throws NoPlayerException, CannotRealizeException, IOException { // コンポーネント生成 JFrame frame = new JFrame("ImgCapture"); frame.setBounds(50, 50, 640, 480); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // エラー回避のため、画面の終了ボタンからは終了させない JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); player = Manager.createRealizedPlayer(new MediaLocator("vfw://0")); // コンポーネント配置 panel.add(player.getVisualComponent(), BorderLayout.CENTER); frame.add(panel); frame.setVisible(true); player.start(); } /** * 画像をキャプチャする * * @throws IOException */ public byte[] getImg() { // 画像をバッファードイメージに入れる FrameGrabbingControl frameGrabber = (FrameGrabbingControl) player .getControl("javax.media.control.FrameGrabbingControl"); Buffer buf = frameGrabber.grabFrame(); BufferToImage bti = new BufferToImage((VideoFormat) buf.getFormat()); Image img = bti.createImage(buf); BufferedImage bufferdImg = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB); Graphics g = bufferdImg.getGraphics(); g.drawImage(img, 0, 0, 320, 240, Color.white, null); // ファイルに保存 ByteArrayOutputStream bas = new ByteArrayOutputStream(); try { ImageIO.write(bufferdImg, "jpg", bas); } catch (IOException e) { e.printStackTrace(); } byte image[] = bas.toByteArray(); try { bas.close(); } catch (IOException e) { e.printStackTrace(); } return image; } } |