Java实现动态摄像头截图程序

4星 · 超过85%的资源 需积分: 9 17 下载量 69 浏览量 更新于2024-09-15 收藏 10KB TXT 举报
"这是一个使用Java实现的简易照相机程序,能够实时捕获并动态截取摄像头图像作为头像。" 在给定的代码片段中,我们可以看到一个基于Java AWT(Abstract Window Toolkit)和JMF(Java Media Framework)的简单摄像头应用。这个程序允许用户与摄像头进行交互,捕获和保存图片。以下是关键知识点的详细说明: 1. **Java AWT**: AWT是Java的基础图形用户界面(GUI)工具包,提供了创建窗口、按钮、文本框等组件的方法。在这个程序中,AWT被用来创建图形界面,并处理鼠标事件。 2. **Robot类**: `Robot` 类是Java提供的一种模拟用户输入的机制,可以用于屏幕截图。在代码中,它用于获取屏幕上的当前图像。 3. **Graphics和Graphics2D**: `Graphics` 和 `Graphics2D` 类提供了绘制图形和文本的能力。在这个程序中,它们可能用于在屏幕上显示摄像头捕获的图像。 4. **MouseMotionListener**: 这是Java AWT中的一个接口,用于监听鼠标移动事件。在这里可能用于实现选择截图区域的功能。 5. **CaptureDeviceManager**: 来自JMF,它提供了对媒体设备(如摄像头)的管理,包括设备的枚举、选择和配置。 6. **CaptureDeviceInfo**: 该类用于描述捕获设备的信息,如设备名、媒体类型等。 7. **FrameGrabbingControl**: JMF中的接口,用于从播放流中抓取帧。在这个程序中,它可能用于从摄像头流中获取图像帧。 8. **MediaLocator**: 用于指定媒体源的位置,如摄像头的设备ID。 9. **Player和Buffer**: JMF中的类,`Player` 用于播放媒体,而 `Buffer` 用于存储媒体数据。在这个程序中,`Player` 可能用于建立到摄像头的连接,`Buffer` 用于暂存捕获的图像帧。 10. **AudioFormat**: 尽管代码中提到了音频格式,但主要部分似乎是关于图像捕获的。`AudioFormat` 是JMF中定义音频数据格式的类,如果程序同时处理音频,这将用于定义音频的参数。 11. **ImageIO**: Java的标准图像I/O包,用于读取、写入和操作图像文件。在这里,它用于将捕获的图像保存到文件。 12. **SimpleDateFormat和Date**: 这些类用于格式化日期和时间,可能用于为截取的图像生成具有时间戳的文件名。 这个程序通过Java AWT创建用户界面,利用JMF与摄像头交互,实现了动态截取和保存图像的功能。开发者可能通过调整和扩展这些基础组件来添加更多特性,如预览、调整图像质量、添加滤镜等。
2018-11-23 上传
首先到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"); }