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

九河军少

九河军少

2016-02-19 15:31

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享利用JMF编写摄像头拍照程序教程,希望对大家能有一点小小的帮助。
我把程序分为两种,有趣的和无趣的,最近做了几个有趣的项目,其中一个,应当就算是摄像头拍照程序了。用于现场拍照,生成照片,主要用到Java Media Framework(JMF)。

  首先到SUN下载最新的JMF,然后安装。http://java.sun.com/products/java-media/jmf/index.jsp

  然后,说一下需求

  1. 用摄像头拍照

  2. 在文本框输入文件名

  3. 按下拍照按钮,获取摄像头内的图像

  4. 在拍下的照片上有一红框截取固定大小的照片。

  5. 保存为本地图像为jpg格式,不得压缩画质

  技术关键,相信也是大家最感兴趣的部分也就是如何让一个摄像头工作,并拍下一张照片了。

  利用JMF,代码很简单:

//利用这三个类分别获取摄像头驱动,和获取摄像头内的图像流,获取到的图像流是一个Swing的Component组件类

public static Player player = null;
private CaptureDeviceInfo di = null;
private MediaLocator ml = null;

//文档中提供的驱动写法,为何这么写我也不知:)

String str1 = "vfw:Logitech USB Video Camera:0";
String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
di = CaptureDeviceManager.getDevice(str2);
ml = di.getLocator();
try
{
 player = Manager.createRealizedPlayer(ml);
 player.start();
 Component comp;
 if ((comp = player.getVisualComponent()) != null)
 {
  add(comp, BorderLayout.NORTH);
 }
}
catch (Exception e)
{
 e.printStackTrace();
}

  接下来就是点击拍照,获取摄像头内的当前图像。

  代码也是很简单:

private JButton capture;
private Buffer buf = null;
private BufferToImage btoi = null;
private ImagePanel imgpanel = null;
private Image img = null;
private ImagePanel imgpanel = null;

JComponent c = (JComponent) e.getSource();
if (c == capture)//如果按下的是拍照按钮
{
 FrameGrabbingControl fgc =(FrameGrabbingControl)  player.getControl("javax.media.control.FrameGrabbingControl");
 buf = fgc.grabFrame(); // 获取当前祯并存入Buffer类
 btoi = new BufferToImage((VideoFormat) buf.getFormat());
 img = btoi.createImage(buf); // show the image
 imgpanel.setImage(img);
}

  保存图像的就不多说了,以下为示例代码

BufferedImage bi = (BufferedImage) createImage(imgWidth, imgHeight);
Graphics2D g2 = bi.createGraphics();
g2.drawImage(img, null, null);
FileOutputStream out = null;
try
{
 out = new FileOutputStream(s);
}
catch (java.io.FileNotFoundException io)
{
 System.out.println("File Not Found");
}

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1f, false);//不压缩图像
encoder.setJPEGEncodeParam(param);
try
{
 encoder.encode(bi);
 out.close();
}
catch (java.io.IOException io)
{
 System.out.println("IOException");
}

  已经申请将JWebCam建立为一个开源项目,放到GRO,大家发挥自己的想象力加入自己的代码吧,比如拍摄视频,添加图像处理功能,等等。 

展开更多 50%)
分享

猜你喜欢

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

Web开发
利用JMF编写摄像头拍照程序

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

Java JAVA基础
Java中利用JMF编写摄像头拍照程序

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

玩玩QQ像册的“摄像头拍照”功能

电脑入门
玩玩QQ像册的“摄像头拍照”功能

thinkpad t420摄像头拍照教程

电脑入门
thinkpad t420摄像头拍照教程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

QQ空间相册新增“摄像头拍照功能”

电脑入门
QQ空间相册新增“摄像头拍照功能”

利用Delphi编程控制摄像头

Delphi
利用Delphi编程控制摄像头

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在CB中进行DirectX编程(1)

在CB中进行DirectX编程(1)

使用双缓冲技术绘制曲线图

使用双缓冲技术绘制曲线图
下拉加载更多内容 ↓