JMF摄像获取

来源:互联网 发布:心酸的一句话知乎 编辑:程序博客网 时间:2024/04/29 17:00
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>
原创粉丝点击