用于现场拍照,生成照片,主要用到Java Media Framework(JMF)。
首先到SUN下载最新的JMF,然后安装。http://java.sun.com/products/java-media/jmf/index.jsp
或者在我的附件里面找到JMF下载安装。
然后,说一下需求
1. 用摄像头拍照
2. 按下拍照按钮,获取摄像头内的图像
3. 保存为本地图像为jpg格式,不得压缩画质
4. 如果对当前照片不满意,可以重新拍摄。
相信也是大家最感兴趣的部分也就是如何让一个摄像头工作,并拍下一张照片了。
下面是一个已经实现了的示例。
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.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
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 javax.swing.JScrollPane;
import javax.swing.JTextField;
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;
public class GetPhoto extends JPanel implements ActionListener{
private CaptureDeviceInfo captureDeviceInfo=null;
private MediaLocator mediaLocator=null;
private static Player player=null;
private ImagePanel imagePanel=null;
private JButton jbok,jbcancel;
private Buffer buffer=null;
private VideoFormat videoFormat=null;
private BufferToImage bufferToImage=null;
private Image image=null;
private JPanel jp=new JPanel();
public GetPhoto()
{
//setLayout(new BorderLayout());
this.setLayout(null);
setSize(300,500);
String str="vfw:Microsoft WDM Image Capture (Win32):0";
captureDeviceInfo=CaptureDeviceManager.getDevice(str);
mediaLocator=new MediaLocator("vfw://0");
imagePanel=new ImagePanel();
jbok=new JButton("拍 照");
jbcancel=new JButton("重 拍");
jbok.addActionListener(this);
jbcancel.addActionListener(this);
try {
player=Manager.createRealizedPlayer(mediaLocator);
player.start();
Component comp;
if((comp=player.getVisualComponent())!=null)
comp.setBounds(0, 0, 240, 180);
this.add(comp);
} catch (NoPlayerException e)
{
e.printStackTrace();
} catch (CannotRealizeException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
jp.add(jbok);
jp.add(jbcancel);
jp.add(imagePanel);
jp.setBounds(0, 180, 240, 200);
this.add(jp);
}
public void print(Graphics g)
{
super.print(g);
g.setColor(new Color(255,0,0));
g.drawLine(0, 0, 100, 100);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jbok)
{
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,"temp.jpg");
}
if(e.getSource()==jbcancel)
{
imagePanel.setImage(null);
}
}
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)
{
e.printStackTrace();
}
JPEGImageEncoder je=JPEGCodec.createJPEGEncoder(fos);
JPEGEncodeParam jp=je.getDefaultJPEGEncodeParam(bi);
jp.setQuality(1f, false);
je.setJPEGEncodeParam(jp);
try {
je.encode(bi);
fos.close();
} catch (ImageFormatException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
public static File getImage()
{
File f=new File("temp.jpg");
return f;
}
class ImagePanel extends Panel
{
public Image myimg = null;
public ImagePanel()
{
setLayout(null);
setSize(240,180);
}
public void setImage(Image img)
{
this.myimg = img;
repaint();
}
public void paint(Graphics g)
{
if (myimg != null)
{
g.drawImage(myimg, 0, 0, this);
}
}
}
public static void main(String[] args)
{
JFrame f = new JFrame("FirstCapture");
GetPhoto cf = new GetPhoto();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
player.close();
System.exit(0);}});
f.add("Center",cf);
f.pack();
f.setBounds(100,100,240,550);
f.setVisible(true);
}
}
分享到:
- 2008-10-25 10:10
- 浏览 2595
- 评论(0)
- 论坛回复 / 浏览 (0 / 7237)
- 查看更多
相关推荐
6. **编程接口**:JMF提供了丰富的编程接口,允许开发者自定义处理多媒体数据的算法,实现更复杂的多媒体应用。 7. **跨平台性**:作为Java的一部分,JMF具有良好的跨平台兼容性,可以在运行Java的任何操作系统上...
Java多媒体框架JMF(Java Media Framework)是一个用于开发多媒体应用程序的平台,它允许Java开发者处理音频、视频和流媒体内容。JMF对于实现视频会议系统和其他多媒体应用是至关重要的。以下是对JMF中涉及的一些...
总的来说,JMF是Java多媒体开发领域的一个重要组成部分,虽然它有一些局限性,但在许多场景下仍然是一个实用的解决方案。如果你正在开发需要处理多媒体的Java应用,那么JMF的知识将为你打开一扇新的大门。
Java多媒体框架(Java Media Framework, 简称JMF)是Java平台上的一个核心API,用于处理音频、视频和其他时间同步的多媒体数据。它为开发者提供了丰富的功能,以支持多媒体内容的播放、捕获、处理和流式传输。在Java...
在"JMF安装包,java多媒体安装包"中,我们主要关注的是如何在Windows操作系统上安装和配置JMF。首先,你需要下载提供的文件“jmf-2_1_1e-windows-i586.exe”,这是一个专门为Windows设计的32位安装程序。在执行安装...
Java多媒体框架(Java Media Framework, 简称JMF)是Java平台上的一个核心API,主要用于处理音频、视频和其他时间同步的多媒体数据。这个API允许开发者识别、操作和播放多种格式的多媒体文件,为Java应用程序提供了...
"jmf2.1 JAVA多媒体"指的是JMF的2.1.1e版本,这是一个专为Windows i586架构设计的安装包。下面我们将深入探讨JMF及其在多媒体处理中的应用。 1. **JMF简介** JMF,全称为Java Media Framework,是由Sun ...
### JAVA多媒体开发手册 JMF API #### JMF概述与核心组件 Java多媒体框架(JMF)为Java平台引入了一系列强大的多媒体处理能力。JMF不仅支持常见的多媒体文件格式,如AU、AVI、MIDI、MPEG、QuickTime和WAV等,还...
ZZLG多媒体音乐播放器是一款基于Java编程语言,利用Java Media ...开发者在设计和实现这个播放器时,不仅考虑到了多媒体处理的基本需求,还关注到了用户交互和个性化体验,展示了Java在开发多媒体应用上的强大潜力。
Java Media Framework(JMF)是Java平台上的...通过深入理解JMF的原理和API,开发者可以创建出功能丰富的多媒体应用,满足各种需求。这份“JMF教程”将是你探索JMF世界的一把钥匙,帮助你快速上手并熟练掌握这个框架。
JMF 提供了一个统一的接口,使得开发者无需深入理解底层的多媒体编码和解码机制,就能实现多媒体应用,如音乐播放器。 在“java用的Jmf 开发音乐播放器”这个主题中,我们主要会涉及到以下几个关键知识点: 1. **...
这使得JMF成为了Java平台上进行多媒体应用开发的重要工具之一。 #### JMF的主要功能与组成部分 ##### 数据源(DataSource) 数据源(DataSource)是JMF中的核心组件之一,它代表了媒体数据的来源。DataSource可以...
JMF 是由Sun Microsystems开发的,主要用于构建和部署多媒体应用程序。它提供了一个服务框架,允许开发者处理各种媒体类型,如MPEG、AVI、JPEG等。JMF 支持动态加载不同的媒体插件,这些插件能够处理特定的媒体格式...
本资源文件是一份详尽的Java多媒体开发指南,旨在为开发者提供全面的Java环境下进行多媒体应用开发的指导。无论您是初涉Java多媒体开发的新手,还是已有丰富经验的老手,这份指南都能为您带来实用的帮助和深入的理解...
### Java中利用JMF编写摄像头拍照程序实例 #### 背景与介绍 在现代软件开发中,多媒体处理是一项非常重要的技术。Java Media Framework (JMF) 是Sun ...希望本文能帮助你在Java多媒体编程领域迈出坚实的一步。
JMF支持多种媒体格式,并允许开发者构建复杂的多媒体应用程序。JMF的关键特性包括: 1. **媒体播放**:可以播放各种音频和视频文件格式。 2. **媒体捕捉**:可以从硬件设备(如摄像头或麦克风)捕捉音频和视频数据...
书中涉及到的MediaAPI包括Java2DAPI、Java3DAPI、JavaSoundAPI、JMFAPI等,它们都是Java语言体系专为编写Java多媒体应用程序而开发的应用程序接口。本书包括的内容有:Java多媒体技术概述,Java二维图形图像处理技术...
通过JMF,开发者可以创建复杂的多媒体应用,如在线流媒体服务器、多媒体播放器和视频会议系统等。JMF支持多种编码格式和协议,包括MPEG、WAV、QuickTime、RealMedia等。 **核心组件** 1. **Service Provider ...
学习和掌握Java多媒体技术,特别是JMF,有助于开发者创建功能丰富的多媒体应用程序,满足用户对音视频播放、编辑、分享的需求。通过研究"java多媒体技术配套光盘代码"中的内容,开发者可以加深对JMF的理解,提升在...