jmf 照相机程序

来源:互联网 发布:飞控地面站软件 编辑:程序博客网 时间:2024/05/01 09:48
     自己学习jmf,编写了一个照相机程序。将源代码发上来。希望高手给予指点,有些地方不太懂
package MyCamera;import javax.swing.JFrame;import javax.swing.JPanel;/** * 主面板类 * @author liunian * */public class MyCamera extends JFrame{private JPanel pnlMain;//主面板放置操作面板和镜头面板private OperatePanel pnlOperate;//操作面板private ScenePanel pnlScene;//镜头面板public MyCamera() {pnlMain = (JPanel) this.getContentPane();    pnlScene = new ScenePanel();pnlOperate = new OperatePanel(pnlScene);    initMain();init();}//初始化主面板public void initMain() {pnlMain.setLayout(null);pnlOperate.setBounds(0, 0, 100, 400);pnlMain.add(pnlOperate);pnlScene.setBounds(100, 0, 400, 400);pnlMain.add(pnlScene);}public void init() {this.pack();this.setSize(500, 400);this.setTitle("我的相机");//this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setLocationRelativeTo(null);this.setVisible(true);}}
package MyCamera;import java.awt.Graphics;import java.awt.Image;import javax.swing.JPanel;/** * 显示抓拍下来照片的面板 * @author liunian * */public class ImagePanel extends JPanel {private Image image;public ImagePanel() {init();} public void init() {this.setLayout(null);this.setSize(400, 400);}public void setImage(Image image) {this.image = image;}public void paint(Graphics g) {if(image != null) {g.drawImage(image, 0, 0, 400, 400, this);}}}

package MyCamera;import java.awt.Component;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import javax.media.CannotRealizeException;import javax.media.Buffer;import javax.media.Manager;import javax.media.MediaLocator;import javax.media.NoPlayerException;import javax.media.Player;import javax.media.control.FrameGrabbingControl;import javax.media.format.VideoFormat;import javax.media.util.BufferToImage;import com.sun.image.codec.jpeg.ImageFormatException;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;/** * 各种方法的DAO类 * @author Administrator * */public class OperateDAO {//private CaptureDeviceInfo captureDeviceInfo;private MediaLocator mediaLocator;private static Player player;private Buffer buffer;private BufferToImage bufferToImage;private Image image;//初始化设备public Component initCamera(String deviceName, String deviceLocation) {Component comp = null;// 获得设备信息//captureDeviceInfo = CaptureDeviceManager.getDevice(deviceName);mediaLocator = new MediaLocator(deviceLocation);// 此类描述媒体目录的地址????try {player = Manager.createRealizedPlayer(mediaLocator);comp = player.getVisualComponent();} catch (NoPlayerException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (CannotRealizeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return comp;}//打开设备public void openCamera() {if(player != null) {player.start();}}//关闭设备public void closeCamera() {if(player!=null) {player.close();}}//照相public Image photo() {FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");buffer = fgc.grabFrame();bufferToImage = new BufferToImage((VideoFormat) buffer.getFormat());image = bufferToImage.createImage(buffer);System.out.println("照相完毕");return image;}//保存照片(未彻底理解这几个方法)public void savePhoto(Image image, String path) {BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);//这两句话必须加否则输出的图片无法正确显示Graphics2D g2 = bi.createGraphics();g2.drawImage(image, null, null);FileOutputStream fos = null;try {fos = new FileOutputStream(path);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}//JPEGCodec.createJPEGEncoder的作用是创建一个和指定输出流关联的JPEGImageEncoder对象JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos);//封装了所有的关于jpeg的参数JPEGEncodeParam jpegParam = jpegEncoder.getDefaultJPEGEncodeParam(bi);//quality取值在 1.0 到 0.0 之间Some guidelines: (0.75 high quality)  (0.5  medium quality)  (0.25 low quality) (1f不压缩图像)jpegParam.setQuality(1f, false);jpegEncoder.setJPEGEncodeParam(jpegParam);try {jpegEncoder.encode(bi);if(fos!=null) {fos.close();}} catch (ImageFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package MyCamera;import java.awt.Color;import java.awt.Component;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import javax.swing.JButton;import javax.swing.JFileChooser;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.filechooser.FileFilter;/** * 操作面板 * @author liunian * */public class OperatePanel extends JPanel {private JButton btnClose;private JButton btnPhoto;private JButton btnRePhoto;private JButton btnSave;private JButton btnDel;private ScenePanel pnlScene;private OperateDAO odao;private Image image;private Component comp;private ImagePanel pnlImage;public OperatePanel(ScenePanel pnlScene) {this.setBackground(Color.blue);OperatePanel_btns_ActionListener oba = new OperatePanel_btns_ActionListener(this);btnClose = new JButton("关    闭");btnClose.addActionListener(oba);btnPhoto = new JButton("拍    照");btnPhoto.addActionListener(oba);btnRePhoto = new JButton("重    拍");btnRePhoto.setEnabled(false);btnRePhoto.addActionListener(oba);btnSave = new JButton("保    存");btnSave.setEnabled(false);btnSave.addActionListener(oba);btnDel =  new JButton("删    除");btnDel.setEnabled(false);btnDel.addActionListener(oba);odao = new OperateDAO();pnlImage = new ImagePanel();this.pnlScene = pnlScene;comp = pnlScene.getCameraCom();init();}public void init() {pnlImage.setBounds(0, 0, 400, 400);this.add(btnClose);this.add(btnPhoto);this.add(btnRePhoto);this.add(btnSave);this.add(btnDel);}public void btns_actionPerformed(ActionEvent e) {if(e.getSource().equals(btnClose)) {System.out.println("关闭");this.close();}if(e.getSource().equals(btnPhoto)) {System.out.println("照相");            image = this.photo();            btnRePhoto.setEnabled(true);            btnSave.setEnabled(true);            btnDel.setEnabled(true);}if(e.getSource().equals(btnRePhoto)) {System.out.println("重新照相");            this.rePhoto();            btnRePhoto.setEnabled(false);            btnSave.setEnabled(false);            btnDel.setEnabled(false);}if(e.getSource().equals(btnSave)) {System.out.println("保存");            this.savePhoto();}if(e.getSource().equals(btnDel)) {System.out.println("删除");            this.delPhoto();}}//关闭public void close() {odao.closeCamera();System.exit(0);}//照相public Image photo() {System.out.println("开始照相");Image image = odao.photo();if(image!=null) {this.showImage(image);System.out.println("展示相片");}return image;}//将捕捉到的相片展示(注意将展示的照片处理大小使其全部显示)/* * 待解决的问题  多次拍照会出现照片重叠的现象 */public void showImage(Image image) {//将原组件设置为不可见comp.setVisible(false);//对显示照片的面板做处理pnlImage.setImage(image);//pnlImage.repaint();//将展示的面板设置为可见pnlImage.setVisible(true);//加载到显示区并调用重绘函数pnlScene.add(pnlImage);pnlScene.repaint();}//重新照相public void rePhoto() {image = null;//将原来的清空pnlImage.setVisible(false);comp.setVisible(true);}//保存照片public void savePhoto() {if(image != null) {//创建一个文件选择器JFileChooser fChooser = new JFileChooser();//设置默认打开的目录F:/MyFile/eclipseWorkspace/testCamera/fChooser.setCurrentDirectory(new File("photo"));//设置保存的文件类型JPGFileFilter jpgFilter = new JPGFileFilter();fChooser.setFileFilter(jpgFilter);//方法返回参数表示确定  取消  发生错误int result = fChooser.showSaveDialog(this);String  photoPath = "";if(result == JFileChooser.APPROVE_OPTION) {//获得文件的路径包括文件名File f = fChooser.getSelectedFile();if(f != null) {photoPath = f.getAbsolutePath(); String extenName = fChooser.getFileFilter().getDescription();extenName = extenName.substring(extenName.indexOf('.'),extenName.indexOf('('));if(!photoPath.endsWith(extenName)) {photoPath += extenName;}}odao.savePhoto(image,photoPath);}} }//删除照片public void delPhoto() {}//public void setPnlScene(ScenePanel pnlScene) {//this.pnlScene = pnlScene;//}}/** * 监听按钮的监听器 * @author liunian * */class OperatePanel_btns_ActionListener implements ActionListener {private OperatePanel pnlOperate;public OperatePanel_btns_ActionListener(OperatePanel pnlOperate) {this.pnlOperate = pnlOperate;}public void actionPerformed(ActionEvent e) {pnlOperate.btns_actionPerformed(e);}}/** * 重写文件过滤器 * @author liunian *  */class JPGFileFilter extends FileFilter{//说明可接受的文件类型public boolean accept(File f) {String fileName = f.getName();return fileName.toLowerCase().endsWith(".jpg");}//对话框下面的提示字符public String getDescription() {return "*.jpg(图像文件)";}}
package MyCamera;import java.awt.Color;import java.awt.Component;//import java.awt.Graphics;//import java.io.IOException;//import javax.media.CannotRealizeException;//import javax.media.CaptureDeviceInfo;//import javax.media.CaptureDeviceManager;//import javax.media.Manager;//import javax.media.MediaLocator;//import javax.media.NoPlayerException;//import javax.media.Player;import javax.swing.JOptionPane;import javax.swing.JPanel;/** * 照相机面板 * @author liunian * */public class ScenePanel extends JPanel{private OperateDAO odao;private Component comp;public ScenePanel() {this.setBackground(Color.green);odao = new OperateDAO();init();}public void init() {this.setLayout(null);//注意如果不设空布局 则设尺寸不起作用this.setSize(400, 400);initCamera();}public void initCamera() {comp = odao.initCamera("vfw:Microsoft WDM Image Capture (Win32):0","vfw://0");if(comp != null) {comp.setBounds(0, 0, 400, 400);this.add(comp);odao.openCamera();System.out.println("设备初始化完成");} else {JOptionPane.showMessageDialog(null, "请检查您的设备是否在使用中", "提示", JOptionPane.INFORMATION_MESSAGE);}}public Component getCameraCom() {return comp;}}
package MyCamera;/** * 启动类 * @author liunian * */public class Start {public static void main(String[] args) {new MyCamera();}}







原创粉丝点击