jmf天昏地暗之路(三)抓取当前帧照片并保存为bmp格式(结束)
断断续续弄了差不多两个星期,终于把这个弄好了,在我的电脑上以及朋友的xp系统上测试成功!
下面不多说,直接上代码。
说明:电脑必须装好jmf,并且用JMStudio能正常打开摄像头,否则运行不了,具体是什么原因我也不太清楚。
//已成功实现功能,获取当前摄像头并且拍照。 //照片存在E:\photo目录下 import java.awt.Component; import java.awt.FlowLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; 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.JFrame; import javax.swing.JPanel; import com.sun.media.jai.codec.BMPEncodeParam; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.ImageEncoder; public class CapturePicture extends JFrame implements ActionListener{ private static CapturePicture jframe=new CapturePicture(); private JPanel showPhone=new JPanel(); //用来接受摄像头数据 private JPanel bpanel=new JPanel(); private JButton button=new JButton("拍照"); //摄像头驱动 private CaptureDeviceInfo captureDeviceInfo=null; private MediaLocator mediaLocator=null; private static Player player=null; private Buffer buffer=null; private VideoFormat videoFormat=null; private BufferToImage bufferToImage=null; private Image image=null; //构造器 private CapturePicture() { } protected void Init() { jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.setBounds(200,100,600,600); jframe.setVisible(true); jframe.setTitle("拍照小程序"); jframe.setResizable(true); jframe.setLayout(null);//绝对布局 jframe.add(showPhone); jframe.add(bpanel); bpanel.setBounds(0,500,100,100); bpanel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10)); bpanel.add(button); button.addActionListener(this); String str="vfw:Microsoft WDM Image Capture (Win32):0"; captureDeviceInfo=CaptureDeviceManager.getDevice(str); mediaLocator=new MediaLocator("vfw://0"); try { player=Manager.createRealizedPlayer(mediaLocator); player.start(); Component comp; if((comp=player.getVisualComponent())!=null) comp.setBounds(0, 0, 700, 500); this.add(comp); } catch (NoPlayerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CannotRealizeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //创建照片所用的文件夹 File photo=new File("E:\\","photo"); photo.mkdir(); } public static CapturePicture getCP() { return jframe; } //获取照片 private void takePhoto() { //获取照片 FrameGrabbingControl fgc=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl"); buffer=fgc.grabFrame(); bufferToImage=new BufferToImage((VideoFormat)buffer.getFormat()); image=bufferToImage.createImage(buffer); OutputStream out=null; Date date=new Date(); Long dtime=date.getTime(); try { out=new FileOutputStream("E:\\photo\\"+dtime+".BMP"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //可能是改参数的地方 BMPEncodeParam param = new BMPEncodeParam(); ImageEncoder enc = ImageCodec.createImageEncoder("BMP", out, param); try { enc.encode((RenderedImage) image); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String args[]) { CapturePicture cp=CapturePicture.getCP(); cp.Init(); } @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub takePhoto(); } }