jmf捕获USB摄象头 我有一个USB的摄象头,我想用JAVA实现显示摄象头的数据,听说JMF可以实现,请问如何实现,谢谢,希望能给出相关代码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //package com.redtroy;import javax.media.Player;import javax.media.CaptureDeviceInfo;import javax.media.MediaLocator;import javax.swing.*;import java.awt.*;import java.awt.image.*;import java.awt.event.*;import javax.media.control.FrameGrabbingControl;import javax.media.Buffer;import javax.media.util.BufferToImage;import javax.media.format.VideoFormat;import java.io.*;import com.sun.image.codec.jpeg.*;import javax.media.CaptureDeviceManager;import javax.media.Manager;import java.net.*;import java.applet.*;//import javax.swing.im/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: </p> * @author not attributable * @version 1.0 */public class Camera extends JFrame { private static Player player = null; private CaptureDeviceInfo device = null; private MediaLocator locator = null; private Buffer buffer = null; private BufferToImage b2i = null; private Image image; private ImageIcon iicon = new ImageIcon(); boolean proportion = true; String str1 = "vfw:Logitech USB Video Camera:0"; String str2 = "vfw:Microsoft WDM Image Capture (Win32):0"; JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); Component component1; JLabel jLabel1 = new JLabel(); public Camera() { super("troy的摄像机(无保存功能)"); try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } public Image resize(int width, int height, Image source, boolean flag) { this.proportion = flag; int new_w; int new_h; Toolkit tk = Toolkit.getDefaultToolkit(); Applet app = new Applet(); MediaTracker mt = new MediaTracker(app); Image img = source; try { mt.addImage(img, 0); mt.waitForID(0); } catch (Exception e) { e.printStackTrace(); } if (img.getWidth(null) == -1) { System.out.println(" can't read,retry!" + "<BR>"); return null; } else { if (this.proportion == true) { //判断是否是等比缩放.//为等比缩放计算输出的图片宽度及高度 double rate1 = ( (double) img.getWidth(null)) / (double) width + 0.1; double rate2 = ( (double) img.getHeight(null)) / (double) height + 0.1; double rate = rate1 > rate2 ? rate1 : rate2; new_w = (int) ( ( (double) img.getWidth(null)) / rate); new_h = (int) ( ( (double) img.getHeight(null)) / rate); } else { new_w = width; //输出的图片宽度 new_h = height; //输出的图片高度 } } BufferedImage buffImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); Graphics g = buffImg.createGraphics(); g.setColor(Color.white); g.fillRect(0, 0, new_w, new_h); g.drawImage(img, 0, 0, new_w, new_h, null); g.dispose(); try { OutputStream tempout = new FileOutputStream("C:\\temp.jpg"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout); encoder.encode(buffImg); tempout.close(); } catch (Exception e) { e.printStackTrace(); } return tk.createImage("C:\\temp.jpg"); } public static void main(String[] args) { Camera camera1 = new Camera(); } private void jbInit() throws Exception { component1 = Box.createGlue(); //=====================初始化设备===================// component1.addNotify(); device = CaptureDeviceManager.getDevice(str2); locator = device.getLocator(); try { player = Manager.createRealizedPlayer(locator); player.start(); if ( (component1 = player.getVisualComponent()) != null) { this.getContentPane().add(component1, null); } } catch (Exception e) { e.printStackTrace(); } jButton1.setBounds(new Rectangle(294, 28, 73, 25)); jButton1.setText("拍照"); jButton1.addActionListener(new Camera_jButton1_actionAdapter(this)); this.getContentPane().setLayout(null); jButton2.setBounds(new Rectangle(295, 82, 73, 25)); jButton2.setText("保存"); jButton2.addActionListener(new Camera_jButton2_actionAdapter(this)); component1.setBounds(new Rectangle(27, 23, 243, 235)); jLabel1.setIconTextGap(4); jLabel1.setText("空"); jLabel1.setVerticalTextPosition(SwingConstants.CENTER); jLabel1.setBounds(new Rectangle(293, 139, 80, 95)); this.getContentPane().add(jButton1, null); this.getContentPane().add(jButton2, null); this.getContentPane().add(jLabel1, null); this.setSize(400, 300); this.setVisible(true); } void jButton1_actionPerformed(ActionEvent e) { iicon = new ImageIcon(); FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl( "javax.media.control.FrameGrabbingControl"); buffer = fgc.grabFrame(); // 获取当前祯并存入Buffer类 b2i = new BufferToImage( (VideoFormat) buffer.getFormat()); image = b2i.createImage(buffer); // show the image iicon = new ImageIcon(); /* Toolkit tk = Toolkit.getDefaultToolkit(); Applet app = new Applet(); MediaTracker mt = new MediaTracker(app);*/ iicon.setImage(this.resize(85, 95, image, true)); jLabel1.setIcon(iicon); } void jButton2_actionPerformed(ActionEvent e) { JFileChooser filechooser = new JFileChooser(); filechooser.setFileHidingEnabled(true); filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); int result = filechooser.showSaveDialog(null); if (result == JFileChooser.CANCEL_OPTION) { return; } File file = filechooser.getSelectedFile(); if (file == null || file.getName().equals("")) { JOptionPane.showMessageDialog(null, "无效的文件名", "警告", JOptionPane.ERROR_MESSAGE); } else { String s = file.getAbsolutePath(); BufferedImage bi = (BufferedImage) createImage(image.getWidth(null), image.getHeight(null)); Graphics2D g2 = bi.createGraphics(); g2.drawImage(image, 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"); } } }}class Camera_jButton1_actionAdapter implements java.awt.event.ActionListener { Camera adaptee; Camera_jButton1_actionAdapter(Camera adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); }}class Camera_jButton2_actionAdapter implements java.awt.event.ActionListener { Camera adaptee; Camera_jButton2_actionAdapter(Camera adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton2_actionPerformed(e); }} String str1 = "vfw:Logitech USB Video Camera:0"; String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";str1和str2是摄像头的型号吧,我的是Logitech USB Video Camera,可是在初始化设备时device = CaptureDeviceManager.getDevice(str2);locator = device.getLocator();//这一句报空指针,不知道为什么呢?? 对不起,错了device = CaptureDeviceManager.getDevice(str2);应该是device = CaptureDeviceManager.getDevice(str1);请高手指点,应该是设备得不到 jmf不怎么样,我奉劝一句 javax.media包去哪儿下啊?我这报错说找不到media下的几个包!谢谢! 帮忙分析下,import后有.*何没有.*的区别,以及各个选项 assert问题 如何使用 jimi 显示 多页的 Tiff 格式文件 用Graphics2D 做 emf图片 我做了两天没做出来,高手赐教 请教一个java中的同步问题 基础问题 有关于java访问sqlserver日志文件的问题。请教~~~~~ 这个简单的问题要麻烦大家了,不好意思我是个java的菜鸟!,谢谢! File对象 请教,awt/swing高手请进! 请大大们帮忙,JAVA中鼠标问题,谢谢 请问::下面代码那有错误?怎么改?谢谢!
import javax.media.CaptureDeviceInfo;
import javax.media.MediaLocator;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.media.control.FrameGrabbingControl;
import javax.media.Buffer;
import javax.media.util.BufferToImage;
import javax.media.format.VideoFormat;
import java.io.*;
import com.sun.image.codec.jpeg.*;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import java.net.*;
import java.applet.*;//import javax.swing.im
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class Camera
extends JFrame {
private static Player player = null;
private CaptureDeviceInfo device = null;
private MediaLocator locator = null;
private Buffer buffer = null;
private BufferToImage b2i = null;
private Image image;
private ImageIcon iicon = new ImageIcon();
boolean proportion = true;
String str1 = "vfw:Logitech USB Video Camera:0";
String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
Component component1;
JLabel jLabel1 = new JLabel();
public Camera() {
super("troy的摄像机(无保存功能)");
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
} public Image resize(int width, int height, Image source, boolean flag) {
this.proportion = flag;
int new_w;
int new_h;
Toolkit tk = Toolkit.getDefaultToolkit();
Applet app = new Applet();
MediaTracker mt = new MediaTracker(app);
Image img = source;
try {
mt.addImage(img, 0);
mt.waitForID(0);
}
catch (Exception e) {
e.printStackTrace();
}
if (img.getWidth(null) == -1) {
System.out.println(" can't read,retry!" + "<BR>");
return null;
}
else { if (this.proportion == true) { //判断是否是等比缩放.
//为等比缩放计算输出的图片宽度及高度
double rate1 = ( (double) img.getWidth(null)) / (double) width +
0.1;
double rate2 = ( (double) img.getHeight(null)) / (double) height +
0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
new_w = (int) ( ( (double) img.getWidth(null)) / rate);
new_h = (int) ( ( (double) img.getHeight(null)) / rate);
}
else {
new_w = width; //输出的图片宽度
new_h = height; //输出的图片高度
}
}
BufferedImage buffImg = new BufferedImage(new_w, new_h,
BufferedImage.TYPE_INT_RGB); Graphics g = buffImg.createGraphics(); g.setColor(Color.white);
g.fillRect(0, 0, new_w, new_h); g.drawImage(img, 0, 0, new_w, new_h, null); g.dispose();
try {
OutputStream tempout = new
FileOutputStream("C:\\temp.jpg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
encoder.encode(buffImg);
tempout.close(); }
catch (Exception e) {
e.printStackTrace();
}
return tk.createImage("C:\\temp.jpg");
} public static void main(String[] args) {
Camera camera1 = new Camera();
} private void jbInit() throws Exception { component1 = Box.createGlue();
//=====================初始化设备===================//
component1.addNotify();
device = CaptureDeviceManager.getDevice(str2);
locator = device.getLocator();
try {
player = Manager.createRealizedPlayer(locator);
player.start(); if ( (component1 = player.getVisualComponent()) != null) {
this.getContentPane().add(component1, null);
}
}
catch (Exception e) {
e.printStackTrace();
} jButton1.setBounds(new Rectangle(294, 28, 73, 25));
jButton1.setText("拍照");
jButton1.addActionListener(new Camera_jButton1_actionAdapter(this));
this.getContentPane().setLayout(null);
jButton2.setBounds(new Rectangle(295, 82, 73, 25));
jButton2.setText("保存");
jButton2.addActionListener(new Camera_jButton2_actionAdapter(this));
component1.setBounds(new Rectangle(27, 23, 243, 235));
jLabel1.setIconTextGap(4);
jLabel1.setText("空");
jLabel1.setVerticalTextPosition(SwingConstants.CENTER); jLabel1.setBounds(new Rectangle(293, 139, 80, 95)); this.getContentPane().add(jButton1, null);
this.getContentPane().add(jButton2, null);
this.getContentPane().add(jLabel1, null);
this.setSize(400, 300);
this.setVisible(true);
} void jButton1_actionPerformed(ActionEvent e) {
iicon = new ImageIcon();
FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl(
"javax.media.control.FrameGrabbingControl");
buffer = fgc.grabFrame(); // 获取当前祯并存入Buffer类
b2i = new BufferToImage( (VideoFormat) buffer.getFormat());
image = b2i.createImage(buffer); // show the image
iicon = new ImageIcon();
/* Toolkit tk = Toolkit.getDefaultToolkit();
Applet app = new Applet();
MediaTracker mt = new MediaTracker(app);*/
iicon.setImage(this.resize(85, 95, image, true));
jLabel1.setIcon(iicon); } void jButton2_actionPerformed(ActionEvent e) { JFileChooser filechooser = new JFileChooser();
filechooser.setFileHidingEnabled(true); filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result = filechooser.showSaveDialog(null);
if (result == JFileChooser.CANCEL_OPTION) {
return;
}
File file = filechooser.getSelectedFile();
if (file == null || file.getName().equals("")) {
JOptionPane.showMessageDialog(null, "无效的文件名", "警告",
JOptionPane.ERROR_MESSAGE);
}
else { String s = file.getAbsolutePath(); BufferedImage bi = (BufferedImage) createImage(image.getWidth(null),
image.getHeight(null));
Graphics2D g2 = bi.createGraphics();
g2.drawImage(image, 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");
}
} }}class Camera_jButton1_actionAdapter
implements java.awt.event.ActionListener {
Camera adaptee; Camera_jButton1_actionAdapter(Camera adaptee) {
this.adaptee = adaptee;
} public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}class Camera_jButton2_actionAdapter
implements java.awt.event.ActionListener {
Camera adaptee; Camera_jButton2_actionAdapter(Camera adaptee) {
this.adaptee = adaptee;
} public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
str1和str2是摄像头的型号吧,我的是Logitech USB Video Camera,可是在初始化设备时
device = CaptureDeviceManager.getDevice(str2);
locator = device.getLocator();//这一句报空指针,不知道为什么呢??
device = CaptureDeviceManager.getDevice(str2);应该是
device = CaptureDeviceManager.getDevice(str1);
请高手指点,应该是设备得不到