`
elvajxw
  • 浏览: 107766 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JMF实现视频拍照代码

阅读更多

前提是加上jmf相关jar包

import java.awt.BorderLayout;    
import java.awt.Color;    
import java.awt.Component;    
import java.awt.Dimension;    
import java.awt.Graphics;    
import java.awt.Graphics2D;    
import java.awt.Image;    
import java.awt.Panel;    
import java.awt.event.ActionEvent;    
import java.awt.event.ActionListener;    
import java.awt.event.WindowAdapter;    
import java.awt.event.WindowEvent;    
import java.awt.image.BufferedImage;    
import java.io.FileNotFoundException;    
import java.io.FileOutputStream;    
import java.io.IOException;    
import java.text.SimpleDateFormat;
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 sounds.ChatFrame;

import com.sun.image.codec.jpeg.ImageFormatException;    
import com.sun.image.codec.jpeg.JPEGCodec;    
import com.sun.image.codec.jpeg.JPEGEncodeParam;    
import com.sun.image.codec.jpeg.JPEGImageEncoder;    
   
/**
 * 用于视频拍照
 *
 * @version 1.00
 * @author 钮
 * @date 2010-8-12
 */
public class FirstCapture extends JPanel implements ActionListener{    
   
    private CaptureDeviceInfo captureDeviceInfo=null;   //捕获硬件设备信息对象 
    private MediaLocator mediaLocator=null;     //媒体定位器
    private static Player player=null;     //播放对象
    private ImagePanel imagePanel=null;     //图片面板
    private JButton capture;        //按钮
    private Buffer buffer=null;       //缓冲区
    private VideoFormat videoFormat=null;     //视频数据格式
    private BufferToImage bufferToImage=null;   //缓存影像 
    private Image image=null;     //图片 
    //static FirstCapture cf = null;
    public FirstCapture()     //构造方法
    {    
          
          
         setLayout(new BorderLayout());     // 设置布局
         setSize(320,550);     //大小
        String str="vfw:Microsoft WDM Image Capture (Win32):0";     //驱动
        captureDeviceInfo=CaptureDeviceManager.getDevice(str);     //获得改驱动的视频硬件
       // MediaLocator mediaLocator=captureDeviceInfo.getLocator();  
        mediaLocator=new MediaLocator("vfw://0");    
        imagePanel=new ImagePanel();     //设置面板
         capture=new JButton("拍照");     //设置按钮名称
         capture.addActionListener(this);     //增加按钮事件
        try {    
            player=Manager.createRealizedPlayer(mediaLocator);  //将本地视频绑定到播放对象中,数据源绑定.  
            player.start();     //启动,一般分为6个状态
            Component comp;     //具有图形表示能力的对象
            Component comp1;     //具有图形表示能力的对象
            if((comp=player.getVisualComponent())!=null)    
                add(comp,BorderLayout.CENTER);    
//          if((comp1=player.getControlPanelComponent())!=null)    
//              add(comp1,BorderLayout.CENTER);    
        } 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();    
        }    
        add(imagePanel,BorderLayout.SOUTH);     //添加到面板的北方
        add(capture,BorderLayout.NORTH);     //添加到面板的中间
    }    
        
    @Override   
    public void print(Graphics g) {    
        // TODO Auto-generated method stub    
        super.print(g);    
        g.setColor(new Color(255,0,0));    
          g.drawLine(0, 0, 100, 100);    
    }    
    public static void main(String args[]){
     FirstCapture cf = new FirstCapture();
     cf.main1(cf);
    }
    public  void main1(FirstCapture cf) {    
        // TODO Auto-generated method stub    
        JFrame f = new JFrame("FirstCapture");     //创建jframe
        //FirstCapture cf = new FirstCapture();     //实例化对象执行构造方法
            
        f.addWindowListener(new WindowAdapter() {    
          public void windowClosing(WindowEvent e) {     //关闭窗口事件
          player.close();     //播放关闭
          //ChatFrame s = new ChatFrame();
          ChatFrame.videoButton.setEnabled(true);
//          ChatFrame.disconnectButton.setEnabled(false);
          //System.exit(0);
          }});     //正常结束退出
            
        f.add("Center",cf);     //添加对象到jframe
        f.pack();     //画面显示大小和画面的实际大小适应
        f.setSize(new Dimension(320,550));     //大小
        f.setVisible(true);     //是否显示
    }    
     
    public void actionPerformed(ActionEvent e) {   //拍照事件 
        // TODO Auto-generated method stub    
        FrameGrabbingControl fgc=(FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");    
        buffer=fgc.grabFrame();    
        bufferToImage=new BufferToImage((VideoFormat)buffer.getFormat());    
        image=bufferToImage.createImage(buffer);    
        imagePanel.setImage(image);    
        saveImage(image,getTimeStr());//设置照片名称    
    }  
   
    public static String getTimeStr() {
        Date currentTime = new Date();//时间
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss");//格式化时间
        String dateString = formatter.format(currentTime);//转换成字符串
        String[] str=dateString.split(" ");     
        return "D:\\rec\\"+str[0]+str[1]+".jpg";
       } 
   
    public static void saveImage(Image image,String path)    
    {    
        BufferedImage bi=new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);    
        Graphics2D g2 = bi.createGraphics();    
        g2.drawImage(image, null, null);    
        FileOutputStream fos=null;     //文件输出流对象
        try {    
                fos=new FileOutputStream(path);     //获得路径
                
        } catch (FileNotFoundException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        }    
        JPEGImageEncoder je=JPEGCodec.createJPEGEncoder(fos);   //创建一个指向  fos的JPEGImageEncoder对象
        JPEGEncodeParam jp=je.getDefaultJPEGEncodeParam(bi);     //@@@
        jp.setQuality(0.5f, false);      //创建替代当前已建量化表的新量化表
        je.setJPEGEncodeParam(jp);      //设置JPEGImageEncoder对象编码操作
        try {    
            je.encode(bi);      // 將 BufferedImage 作为 JPEG 数据流编码。
            fos.close();    
        } catch (ImageFormatException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        } catch (IOException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        }    
            
    }    
    class ImagePanel extends Panel     
      {    
        public Image myimg = null;    
            
        public ImagePanel()     
        {    
          setLayout(null);    
          setSize(320,240);    
        }    
            
        public void setImage(Image img)     
        {    
          this.myimg = img;    
          repaint();    
        }    
            
        public void paint(Graphics g)     
        {    
          if (myimg != null)     
          {    
            g.drawImage(myimg, 0, 0, this);    
          }    
              
        }    
      }    
        
}

分享到:
评论

相关推荐

    用jmf实现的拍照程序

    总的来说,通过这个“用jmf实现的拍照程序”,开发者可以学习到如何在Java环境中设置和控制多媒体设备,捕获视频流,以及如何将单个视频帧保存为图片。尽管JMF已过时,但理解其工作原理仍然对理解多媒体处理的基础...

    Java用JMF拍照

    掌握这些知识点,你就能在Java应用中实现摄像头的实时捕获功能,无论是为了拍照还是录制视频。不过,值得注意的是,JMF已经很久没有更新,可能不支持较新的硬件和编码格式。对于现代开发,更推荐使用JavaFX或第三方...

    jmf架构的调用摄像头拍照的源码。

    在标题和描述中提到的“jmf架构的调用摄像头拍照的源码”,是指利用JMF来访问和控制摄像头,实现拍照功能的代码示例。 JMF的工作原理是通过注册不同的Media Players来处理特定格式的媒体数据。这些Media Players...

    java实现视频的录制和拍照功能Demo

    综上所述,Java实现视频录制和拍照功能涉及多个层次的知识,包括JMF的使用、多媒体数据的处理、GUI编程、异常处理和资源管理等。掌握这些知识点,开发者就能构建出能够满足用户需求的多媒体应用程序。

    JMF_2.1拍照demo

    通过`Manager.createRealizedPlayer()`创建一个已实现的播放器实例,这个播放器将被用来控制视频流。同时,`DataSource`类被用来提供媒体流数据,其`setLocator()`方法用于设置数据源位置。 #### 图像捕获与处理 `...

    Java利用JMF编写摄像头拍照程序.doc

    总的来说,Java利用JMF编写摄像头拍照程序涉及到的主要知识点有:JMF框架的使用,摄像头设备的管理和访问,视频帧的捕获,图像数据的转换以及文件的保存操作。虽然JMF已经过时,但理解这些基本概念对于学习其他...

    JMF摄像拍照程序.............

    本篇将对一个基于JMF的摄像拍照程序进行分析,包括其主要功能、实现原理以及关键代码解读。 #### 二、程序功能 根据给定的信息,此程序主要实现了以下几个功能: 1. **摄像头设备管理**:能够识别并选择摄像头...

    2022年Java中利用JMF编写摄像头拍照程序Java教程.docx

    1. 摄像头拍照:这需要通过JMF获取摄像头设备,并创建一个Player对象来捕获视频流。 2. 输入文件名:用户可以在文本框中输入保存照片的文件名。 3. 拍照按钮:点击按钮触发拍照操作,捕获当前摄像头的帧。 4. 截取...

    用java调用摄像头拍照源代码

    下面将详细介绍如何使用Java和JMF来实现摄像头拍照功能。 首先,我们需要引入JMF的相关库到项目中。JMF的jar文件通常包括`jmf.jar`和`javax.media.jai_core.jar`等,确保这些库被添加到项目的类路径中。 接下来,...

    JMF编程应用

    下面通过一个具体的拍照程序来介绍如何使用JMF实现基本的视频捕获功能。该程序主要分为以下几个步骤: 1. **初始化**: 首先,需要获取摄像头设备的信息,并创建对应的`CaptureDevice`对象。这一步骤可以通过调用`...

    java实现上传音频视频pdf文件功能

    至于“视频拍照”标签,可能是指视频捕获功能。在Java中,可以使用Java Media Framework(JMF)或更现代的JavaFX来捕获和处理视频。但这超出了原始问题的范围,如果需要,可以单独讨论。 总的来说,实现这个功能...

    java调用摄像头拍照

    但是,通过Java Media Framework (JMF) 或者 JavaFX,我们可以实现对摄像头的控制。JMF 是一个开源平台,允许开发者创建、播放和捕获多种媒体数据,而JavaFX则包含更现代和丰富的UI组件,其中包括对多媒体的支持。 ...

    java Swing 中调用摄像头拍照源码(有说明)

    在Java Swing应用中,可以创建一个组件来显示摄像头的实时视频流,然后通过捕获帧来实现拍照功能。 4. **源码分析**: 源码通常会包含以下几个关键部分: - 初始化JMF:设置环境,注册摄像头设备。 - 创建视频...

    JFM_Photo.rar_jfm ja_拍照

    开发者可以创建一个MediaLocator对象来指定摄像头源,然后通过JMF的CaptureDevice获取视频流,进一步处理这些流以实现拍照功能。 “ja”标签可能指的是这个程序是用Java语言编写的。Java是一种广泛应用的面向对象的...

    java实现开机自动调用摄像头拍照存储

    总的来说,实现Java开机自动调用摄像头拍照存储需要对Java编程、摄像头访问API(如JMF或OpenCV)以及操作系统启动任务设置有一定了解。通过合理设计和实现,我们可以创建一个便捷且实用的自动化工具。

    JAVA照相功能[归类].pdf

    本示例代码展示了如何使用JMF实现在Swing环境下集成摄像头拍照功能。以下是关键知识点的详细说明: 1. **Java Swing**: Swing是Java GUI库的一部分,用于构建桌面应用。它提供了一组组件,如按钮、面板等,用于创建...

    海康摄像头识别拍照+水印功能Linux和win环境.zip

    标题中的“海康摄像头识别拍照+水印功能Linux和win环境.zip”表明这是一个与海康摄像头相关的项目,它包含了在Linux和Windows操作系统下实现摄像头识别拍照并添加水印功能的代码或工具。这个项目可能是一个Java应用...

Global site tag (gtag.js) - Google Analytics