⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 captureframe.java

📁 用JAVA写的一个拍照程序
💻 JAVA
字号:
package org.p3p.net.pcam;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.media.Buffer;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.p3p.net.common.ImagePanel;
import org.p3p.net.common.UIHelper;

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;

public class CaptureFrame extends JFrame {

	public static Player player = null;

	private CaptureDeviceInfo di = null;

	private MediaLocator ml = null;

	private JPanel rootPanel;

	private JPopupMenu pmenu, imenu; // 监视菜单

	private Component capturePanel;

	private ImagePanel imagePanel;

	/**
	 * Launch the application 支持选择部分、 移动图像
	 * 
	 * @param args
	 */
	public static void main(String args[]) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			CaptureFrame frame = new CaptureFrame();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the frame
	 */
	public CaptureFrame() {
		super();
		setTitle("JAVA 抓图工具");
		setSize(400, 250);
		rootPanel = (JPanel) getContentPane();
		rootPanel.setLayout(new BorderLayout());
		UIHelper.centerWithScreen(this);

		initGUI();
		startCamera();
		rootPanel.add(imagePanel, BorderLayout.CENTER);
		addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				// TODO 自动生成方法存根
				if (player != null) {
					player.close();
					player = null;
				}
				System.exit(0);
			}

		});

		setIconImage(UIHelper.getImage("/res/images/logo.gif"));
	}

	/**
	 * 
	 * 
	 */
	private void initGUI() {
		PMenuHandle handle = new PMenuHandle();

		imagePanel = new ImagePanel("/res/images/blank.jpg");

		imenu = new JPopupMenu();
		JMenuItem save2File, selectPart, goCapture, sizeA, sizeS, lightA, lightS;
		save2File = new JMenuItem("保存到文件");
		selectPart = new JMenuItem("选择局部");
		goCapture = new JMenuItem("开始拍摄");
		JMenu imageP = new JMenu("图像处理");

		sizeA = new JMenuItem("放大");
		sizeS = new JMenuItem("缩小");
		lightA = new JMenuItem("加亮");
		lightS = new JMenuItem("减暗");

		sizeA.addActionListener(handle);
		sizeS.addActionListener(handle);
		lightA.addActionListener(handle);
		lightS.addActionListener(handle);

		imageP.add(sizeA);
		imageP.add(sizeS);
		imageP.addSeparator();
		imageP.add(lightA);
		imageP.add(lightS);

		save2File.addActionListener(handle);
		selectPart.addActionListener(handle);
		goCapture.addActionListener(handle);
		imenu.add(save2File);
		imenu.add(selectPart);
		imenu.addSeparator();
		imenu.add(imageP);
		imenu.addSeparator();
		imenu.add(goCapture);

		imagePanel.setComponentPopupMenu(imenu);

		pmenu = new JPopupMenu();
		JMenuItem capture = new JMenuItem("抓图");
		pmenu.add(capture);
		capture.addActionListener(handle);

	}

	/**
	 * 
	 * 
	 */
	private void startCamera() {
		// 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();

			if ((capturePanel = player.getVisualComponent()) != null) {
				capturePanel.addMouseListener(new MouseAdapter() {

					public void mouseClicked(MouseEvent e) {
						// TODO 自动生成方法存根
						if ((e.getButton() & MouseEvent.BUTTON2) > 0) {
							Point p = new Point(e.getX(), e.getY());
							SwingUtilities
									.convertPointToScreen(p, capturePanel);
							pmenu.setLocation(p.x, p.y);
							pmenu.setVisible(true);
						}
					}

				});
			}
		}

		catch (Exception e) {
			JOptionPane.showMessageDialog(this, e.getMessage(), "出错了",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	/**
	 * 
	 * 
	 */
	private void doCapture() {
		if (pmenu.isShowing())
			pmenu.setVisible(false);
		if (capturePanel != null && player.getState() == Player.Started) {
			FrameGrabbingControl fgc = (FrameGrabbingControl) player
					.getControl("javax.media.control.FrameGrabbingControl");
			Buffer buf;
			buf = fgc.grabFrame(); // 获取当前祯并存入Buffer类
			BufferToImage btoi = new BufferToImage((VideoFormat) buf
					.getFormat());
			Image img = btoi.createImage(buf);
			imagePanel.setBackground(img);

			rootPanel.remove(capturePanel);
			rootPanel.add(imagePanel, BorderLayout.CENTER);
			SwingUtilities.updateComponentTreeUI(rootPanel);
		}

	}

	/**
	 * 保存图像到文件
	 * 
	 */
	private void save2File() {
		BufferedImage bi = imagePanel.getSelectedImage();
		try {
			FileOutputStream out = new FileOutputStream("d:/test.jpg");
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
			param.setQuality(1.0f, false);
			encoder.setJPEGEncodeParam(param);
			encoder.encode(bi);
			out.close();
			bi = null;
			JOptionPane.showMessageDialog(this, "文件已经成功保存,默认保存到d:/test.jpg",
					"提示信息", JOptionPane.INFORMATION_MESSAGE);
		} catch (FileNotFoundException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (ImageFormatException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}

	}

	/**
	 * 
	 * 事件处理
	 * 
	 */
	class PMenuHandle implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			// TODO 自动生成方法存根
			String command = e.getActionCommand();
			JMenuItem item = (JMenuItem) e.getSource();
			if (command.equals("抓图"))
				doCapture();
			else if (command.equals("开始拍摄")) {
				rootPanel.remove(imagePanel);
				rootPanel.add(capturePanel, BorderLayout.NORTH);
				SwingUtilities.updateComponentTreeUI(rootPanel);
			} else if (command.equals("选择局部")) {
				item.setText("√选择局部");
				imagePanel.setPaintSelectFlag(true);
				SwingUtilities.updateComponentTreeUI(imagePanel);
			} else if (command.equals("√选择局部")) {
				item.setText("选择局部");
				imagePanel.setPaintSelectFlag(false);
				SwingUtilities.updateComponentTreeUI(imagePanel);
			} else if (command.equals("放大")) {
				imagePanel.changeBGSize(1);
				SwingUtilities.updateComponentTreeUI(rootPanel);
			} else if (command.equals("缩小")) {
				imagePanel.changeBGSize(-1);
				SwingUtilities.updateComponentTreeUI(rootPanel);
			} else if (command.equals("保存到文件")) {
				save2File();
			}

		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -