前提是加上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实现的拍照程序”,开发者可以学习到如何在Java环境中设置和控制多媒体设备,捕获视频流,以及如何将单个视频帧保存为图片。尽管JMF已过时,但理解其工作原理仍然对理解多媒体处理的基础...
掌握这些知识点,你就能在Java应用中实现摄像头的实时捕获功能,无论是为了拍照还是录制视频。不过,值得注意的是,JMF已经很久没有更新,可能不支持较新的硬件和编码格式。对于现代开发,更推荐使用JavaFX或第三方...
在标题和描述中提到的“jmf架构的调用摄像头拍照的源码”,是指利用JMF来访问和控制摄像头,实现拍照功能的代码示例。 JMF的工作原理是通过注册不同的Media Players来处理特定格式的媒体数据。这些Media Players...
综上所述,Java实现视频录制和拍照功能涉及多个层次的知识,包括JMF的使用、多媒体数据的处理、GUI编程、异常处理和资源管理等。掌握这些知识点,开发者就能构建出能够满足用户需求的多媒体应用程序。
通过`Manager.createRealizedPlayer()`创建一个已实现的播放器实例,这个播放器将被用来控制视频流。同时,`DataSource`类被用来提供媒体流数据,其`setLocator()`方法用于设置数据源位置。 #### 图像捕获与处理 `...
总的来说,Java利用JMF编写摄像头拍照程序涉及到的主要知识点有:JMF框架的使用,摄像头设备的管理和访问,视频帧的捕获,图像数据的转换以及文件的保存操作。虽然JMF已经过时,但理解这些基本概念对于学习其他...
本篇将对一个基于JMF的摄像拍照程序进行分析,包括其主要功能、实现原理以及关键代码解读。 #### 二、程序功能 根据给定的信息,此程序主要实现了以下几个功能: 1. **摄像头设备管理**:能够识别并选择摄像头...
1. 摄像头拍照:这需要通过JMF获取摄像头设备,并创建一个Player对象来捕获视频流。 2. 输入文件名:用户可以在文本框中输入保存照片的文件名。 3. 拍照按钮:点击按钮触发拍照操作,捕获当前摄像头的帧。 4. 截取...
下面将详细介绍如何使用Java和JMF来实现摄像头拍照功能。 首先,我们需要引入JMF的相关库到项目中。JMF的jar文件通常包括`jmf.jar`和`javax.media.jai_core.jar`等,确保这些库被添加到项目的类路径中。 接下来,...
下面通过一个具体的拍照程序来介绍如何使用JMF实现基本的视频捕获功能。该程序主要分为以下几个步骤: 1. **初始化**: 首先,需要获取摄像头设备的信息,并创建对应的`CaptureDevice`对象。这一步骤可以通过调用`...
至于“视频拍照”标签,可能是指视频捕获功能。在Java中,可以使用Java Media Framework(JMF)或更现代的JavaFX来捕获和处理视频。但这超出了原始问题的范围,如果需要,可以单独讨论。 总的来说,实现这个功能...
但是,通过Java Media Framework (JMF) 或者 JavaFX,我们可以实现对摄像头的控制。JMF 是一个开源平台,允许开发者创建、播放和捕获多种媒体数据,而JavaFX则包含更现代和丰富的UI组件,其中包括对多媒体的支持。 ...
在Java Swing应用中,可以创建一个组件来显示摄像头的实时视频流,然后通过捕获帧来实现拍照功能。 4. **源码分析**: 源码通常会包含以下几个关键部分: - 初始化JMF:设置环境,注册摄像头设备。 - 创建视频...
开发者可以创建一个MediaLocator对象来指定摄像头源,然后通过JMF的CaptureDevice获取视频流,进一步处理这些流以实现拍照功能。 “ja”标签可能指的是这个程序是用Java语言编写的。Java是一种广泛应用的面向对象的...
总的来说,实现Java开机自动调用摄像头拍照存储需要对Java编程、摄像头访问API(如JMF或OpenCV)以及操作系统启动任务设置有一定了解。通过合理设计和实现,我们可以创建一个便捷且实用的自动化工具。
本示例代码展示了如何使用JMF实现在Swing环境下集成摄像头拍照功能。以下是关键知识点的详细说明: 1. **Java Swing**: Swing是Java GUI库的一部分,用于构建桌面应用。它提供了一组组件,如按钮、面板等,用于创建...
标题中的“海康摄像头识别拍照+水印功能Linux和win环境.zip”表明这是一个与海康摄像头相关的项目,它包含了在Linux和Windows操作系统下实现摄像头识别拍照并添加水印功能的代码或工具。这个项目可能是一个Java应用...