📄 captureframe.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 + -