JMF 全称是:Java Media FrameWork 中文:Java 媒体框架
下载地址:http://java.sun.com/products/java-media/jmf/2.1.1/index.html
下载完JMF安装它,在它的安装目录下找到lib在其lib下的jmf.jar和mediaplayer.jar加入到系统环境变量中.
在JMF提供的数多API中足够完成一个拍照,摄像软件,下面是个示例程序:
------------------------------------------------------------------------------------------------
vedio.java
import javax.swing.*;
import java.io.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import com.sun.image.codec.jpeg.*;
public class vedio extends JApplet implements ActionListener {
public static Player player = null;
private CaptureDeviceInfo di = null;
private MediaLocator ml = null;
private JButton capture = null;
private JButton save = null;
private JTextField num = null;
private Buffer buf = null;
private Image img = null;
//private VideoFormat vf = null;
private BufferToImage btoi = null;
private ImagePanel imgpanel = null;
/**
* 选取x,y,width,height默值
*/
private int rectX;
private int rectY;
private int rectWidth = 150;
private int rectHeight = 200;
private int imgWidth = 320;
private int imgHeight = 240;
private String fname = "test";
public vedio() {
setLayout(new BorderLayout());
setSize(320, 550);
imgpanel = new ImagePanel();
imgpanel.addMouseMotionListener(imgpanel);
capture = new JButton("");
capture.addActionListener(this);
save = new JButton("");
save.addActionListener(this);
num = new JTextField();
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);
}
Panel panel1 = new Panel(new BorderLayout());
panel1.add(capture, BorderLayout.NORTH);
panel1.add(new Label("应募:"), BorderLayout.WEST);
panel1.add(num, BorderLayout.CENTER);
panel1.add(save, BorderLayout.SOUTH);
add(panel1, BorderLayout.CENTER);
add(imgpanel, BorderLayout.SOUTH);
}
catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
JFrame f = new JFrame("拍照");
vedio cf = new vedio();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
playerclose();
System.exit(0);
}
});
f.add("Center", cf);
f.pack();
f.setSize(new Dimension(320, 590));
f.setVisible(true);
}
public static void playerclose(){
player.close();
player.deallocate();
}
public void actionPerformed(ActionEvent e){
JComponent c = (JComponent) e.getSource();
if (c == capture){ // Grab a frame
FrameGrabbingControl fgc =(FrameGrabbingControl) player.getControl(
"javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame(); // Convert it to an image
btoi = new BufferToImage((VideoFormat) buf.getFormat());
img = btoi.createImage(buf); // show the image
imgpanel.setImage(img); // save image
}
else if (c == save){
if (img != null){
fname = !num.getText().equals("") ? num.getText() : "test";
saveJPG(img, "Photo/" + fname + ".jpg");
}
}
}
class ImagePanel extends Panel implements MouseMotionListener
{
private Image myimg = null;
public ImagePanel(){
setLayout(null);
setSize(imgWidth, imgHeight);
}
public void setImage(Image img){
this.myimg = img;
repaint();
}
public void update(Graphics g){
g.clearRect(0, 0, getWidth(), getHeight());
if (myimg != null){
g.drawImage(myimg, 0, 0, this);
g.setColor(Color.RED);
g.drawRect(rectX, rectY, rectWidth, rectHeight);
}
}
public void paint(Graphics g){
update(g);
}
public void mouseDragged(MouseEvent e){
rectX = e.getX() - 50;
rectY = e.getY() - 50;
repaint();
}
public void mouseMoved(MouseEvent e){ }
}
public void saveJPG(Image img, String s)
{
BufferedImage bi = (BufferedImage) createImage(imgWidth, imgHeight);
/*BufferedImage bi =
new BufferedImage(
img.getWidth(null),
img.getHeight(null),
BufferedImage.TYPE_INT_RGB);*/
Graphics2D g2 = bi.createGraphics();
g2.clipRect(rectX, rectY, rectWidth, rectHeight);
g2.drawImage(img, null, null);
int moveX = rectX > 0 ? rectX : 0;
int moveY = rectY > 0 ? rectY : 0;
int cutWidth =
rectX + rectWidth > imgWidth
? rectWidth - ((rectX + rectWidth) - imgWidth)
: rectWidth;
int cutHeight =
rectY + rectHeight > imgHeight
? rectHeight - ((rectY + rectHeight) - imgHeight)
: rectHeight;
bi = bi.getSubimage(moveX, moveY, cutWidth, cutHeight);
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");
}
}
}
----------------------------------------------------------------
index.html
<html>
<head></heda>
<body>
<applet
name=aplt
codebase=.
code=vedio.class
width=300
height=200
>
</applet>
</body>
</html>
下载地址:http://java.sun.com/products/java-media/jmf/2.1.1/index.html
下载完JMF安装它,在它的安装目录下找到lib在其lib下的jmf.jar和mediaplayer.jar加入到系统环境变量中.
在JMF提供的数多API中足够完成一个拍照,摄像软件,下面是个示例程序:
------------------------------------------------------------------------------------------------
vedio.java
import javax.swing.*;
import java.io.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import com.sun.image.codec.jpeg.*;
public class vedio extends JApplet implements ActionListener {
public static Player player = null;
private CaptureDeviceInfo di = null;
private MediaLocator ml = null;
private JButton capture = null;
private JButton save = null;
private JTextField num = null;
private Buffer buf = null;
private Image img = null;
//private VideoFormat vf = null;
private BufferToImage btoi = null;
private ImagePanel imgpanel = null;
/**
* 选取x,y,width,height默值
*/
private int rectX;
private int rectY;
private int rectWidth = 150;
private int rectHeight = 200;
private int imgWidth = 320;
private int imgHeight = 240;
private String fname = "test";
public vedio() {
setLayout(new BorderLayout());
setSize(320, 550);
imgpanel = new ImagePanel();
imgpanel.addMouseMotionListener(imgpanel);
capture = new JButton("");
capture.addActionListener(this);
save = new JButton("");
save.addActionListener(this);
num = new JTextField();
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);
}
Panel panel1 = new Panel(new BorderLayout());
panel1.add(capture, BorderLayout.NORTH);
panel1.add(new Label("应募:"), BorderLayout.WEST);
panel1.add(num, BorderLayout.CENTER);
panel1.add(save, BorderLayout.SOUTH);
add(panel1, BorderLayout.CENTER);
add(imgpanel, BorderLayout.SOUTH);
}
catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
JFrame f = new JFrame("拍照");
vedio cf = new vedio();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
playerclose();
System.exit(0);
}
});
f.add("Center", cf);
f.pack();
f.setSize(new Dimension(320, 590));
f.setVisible(true);
}
public static void playerclose(){
player.close();
player.deallocate();
}
public void actionPerformed(ActionEvent e){
JComponent c = (JComponent) e.getSource();
if (c == capture){ // Grab a frame
FrameGrabbingControl fgc =(FrameGrabbingControl) player.getControl(
"javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame(); // Convert it to an image
btoi = new BufferToImage((VideoFormat) buf.getFormat());
img = btoi.createImage(buf); // show the image
imgpanel.setImage(img); // save image
}
else if (c == save){
if (img != null){
fname = !num.getText().equals("") ? num.getText() : "test";
saveJPG(img, "Photo/" + fname + ".jpg");
}
}
}
class ImagePanel extends Panel implements MouseMotionListener
{
private Image myimg = null;
public ImagePanel(){
setLayout(null);
setSize(imgWidth, imgHeight);
}
public void setImage(Image img){
this.myimg = img;
repaint();
}
public void update(Graphics g){
g.clearRect(0, 0, getWidth(), getHeight());
if (myimg != null){
g.drawImage(myimg, 0, 0, this);
g.setColor(Color.RED);
g.drawRect(rectX, rectY, rectWidth, rectHeight);
}
}
public void paint(Graphics g){
update(g);
}
public void mouseDragged(MouseEvent e){
rectX = e.getX() - 50;
rectY = e.getY() - 50;
repaint();
}
public void mouseMoved(MouseEvent e){ }
}
public void saveJPG(Image img, String s)
{
BufferedImage bi = (BufferedImage) createImage(imgWidth, imgHeight);
/*BufferedImage bi =
new BufferedImage(
img.getWidth(null),
img.getHeight(null),
BufferedImage.TYPE_INT_RGB);*/
Graphics2D g2 = bi.createGraphics();
g2.clipRect(rectX, rectY, rectWidth, rectHeight);
g2.drawImage(img, null, null);
int moveX = rectX > 0 ? rectX : 0;
int moveY = rectY > 0 ? rectY : 0;
int cutWidth =
rectX + rectWidth > imgWidth
? rectWidth - ((rectX + rectWidth) - imgWidth)
: rectWidth;
int cutHeight =
rectY + rectHeight > imgHeight
? rectHeight - ((rectY + rectHeight) - imgHeight)
: rectHeight;
bi = bi.getSubimage(moveX, moveY, cutWidth, cutHeight);
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");
}
}
}
----------------------------------------------------------------
index.html
<html>
<head></heda>
<body>
<applet
name=aplt
codebase=.
code=vedio.class
width=300
height=200
>
</applet>
</body>
</html>