package com.xxx.modules.ecamera.util;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.lang.Thread.UncaughtExceptionHandler;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamDiscoveryEvent;
import com.github.sarxos.webcam.WebcamDiscoveryListener;
import com.github.sarxos.webcam.WebcamEvent;
import com.github.sarxos.webcam.WebcamListener;
import com.github.sarxos.webcam.WebcamLock;
import com.github.sarxos.webcam.WebcamPanel;
import com.github.sarxos.webcam.WebcamPicker;
import com.github.sarxos.webcam.WebcamResolution;
import com.github.sarxos.webcam.WebcamUtils;
import com.github.sarxos.webcam.util.ImageUtils;
/**
* J2SE实现开启摄像头拍照功能
*
*/
public class WebcamViewerUtil extends JFrame implements Runnable, WebcamListener, WindowListener, UncaughtExceptionHandler, ItemListener, WebcamDiscoveryListener {
private static final long serialVersionUID = 1L;
private Webcam webcam = null;
private WebcamPanel panel = null;
private WebcamPicker picker = null;
//Webcam resolution
private Dimension webcamResolution = new Dimension(1920, 1080);
//@formatter:off
private Dimension[] nonStandardResolutions = new Dimension[] {
WebcamResolution.PAL.getSize(), WebcamResolution.HD.getSize(),
WebcamResolution.FHDP.getSize(),new Dimension(1920, 1080), };
public WebcamViewerUtil(){}
@Override
public void run() {
Webcam.addDiscoveryListener(this);
setTitle("Webcam Capture POC");
//dispose();
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setLayout(new BorderLayout());
addWindowListener(this);
picker = new WebcamPicker();
picker.addItemListener(this);
picker.setFont(new Font("宋体",Font.PLAIN,16));
picker.setSize(new Dimension(800, 40));
webcam = picker.getSelectedWebcam();
if (webcam == null) {
System.err.println("未找到可用的摄像头");
//抛出异常,线程停止
int i = 1/0;
System.out.println("No webcams found...");
//System.exit(1);
return ;
}
WebcamLock webcamLock = webcam.getLock();
boolean isLocked = webcamLock.isLocked();
if(isLocked){
System.out.println(webcam.getName()+ " 正在开启使用中...");
int i = 1/0;
System.out.println(webcam.getName()+ " is being used...");
return ;
}
webcam.setCustomViewSizes(nonStandardResolutions);
webcam.setViewSize(webcamResolution.getSize());
//webcam.setViewSize(WebcamResolution.VGA.getSize());
webcam.addWebcamListener(WebcamViewerUtil.this);
panel = new WebcamPanel(webcam, false);
panel.setFPSDisplayed(true);
final JButton button = new JButton("拍照");
button.setFont(new Font("宋体",Font.PLAIN,16));
button.setPreferredSize(new Dimension(400, 40));
/*final JButton btnCancle=new JButton("Close Camera");
btnCancle.setFont(new Font("宋体",Font.PLAIN,16));
btnCancle.setPreferredSize(new Dimension(400, 40));
JPanel jPanel = new JPanel();
jPanel.setLayout(new FlowLayout());
jPanel.add(button);
jPanel.add(btnCancle);*/
add(picker, BorderLayout.NORTH);
add(panel, BorderLayout.CENTER);
add(button, BorderLayout.SOUTH);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
button.setEnabled(false);
String fileName = "webcam_" + System.currentTimeMillis();
WebcamUtils.capture(webcam, fileName, ImageUtils.FORMAT_PNG);
//此处将图片输出到项目根目录下
byte[] bytes = WebcamUtils.getImageBytes(webcam, ImageUtils.FORMAT_PNG);
System.out.println("Bytes length: " + bytes.length);
BufferedImage image = webcam.getImage();
System.out.println("image = "+image.getWidth() + "x" + image.getHeight());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "拍照成功");
button.setEnabled(true);
return;
}
});
}
});
pack();
setVisible(true);
Thread t = new Thread() {
@Override
public void run() {
panel.start();
}
};
t.setName("example-starter");
t.setDaemon(true);
t.setUncaughtExceptionHandler(this);
t.start();
}
/**
* main 方法调起摄像头
* @param args
*/
//TODO
public static void main(String[] args) {
SwingUtilities.invokeLater(new WebcamViewerUtil());
}
@Override
public void webcamOpen(WebcamEvent we) {
System.out.println("webcam open");
}
@Override
public void webcamClosed(WebcamEvent we) {
System.out.println("webcam closed");
}
@Override
public void webcamDisposed(WebcamEvent we) {
System.out.println("webcam disposed");
}
@Override
public void webcamImageObtained(WebcamEvent we) {
// do nothing
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
webcam.close();
}
@Override
public void windowClosing(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("webcam viewer resumed");
panel.resume();
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("webcam viewer paused");
panel.pause();
}
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println(String.format("Exception in thread %s", t.getName()));
e.printStackTrace();
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getItem() != webcam) {
if (webcam != null) {
panel.stop();
remove(panel);
webcam.removeWebcamListener(this);
//close
webcam.close();
webcam = (Webcam) e.getItem();
WebcamLock webcamLock = webcam.getLock();
boolean isLocked = webcamLock.isLocked();
if(isLocked){
System.out.println(webcam.getName()+ " 正在开启使用中...");
int i = 1/0;
System.out.println(webcam.getName()+ " is being used...");
return ;
}
webcam.setCustomViewSizes(nonStandardResolutions);
webcam.setViewSize(webcamResolution.getSize());
webcam.addWebcamListener(this);
//System.out.println("selected " + webcam.getName());
panel = new WebcamPanel(webcam, false);
panel.setFPSDisplayed(true);
add(panel, BorderLayout.CENTER);
pack();
Thread t = new Thread() {
@Override
public void run() {
panel.start();
}
};
t.setName("example-stoper");
t.setDaemon(true);
t.setUncaughtExceptionHandler(this);
t.start();
}
}
}
@Override
public void webcamFound(WebcamDiscoveryEvent event) {
if (picker != null) {
picker.addItem(event.getWebcam());
}
}
@Override
public void webcamGone(WebcamDiscoveryEvent event) {
if (picker != null) {
picker.removeItem(event.getWebcam());
}
}
}
MAVEN 引用
<dependency>
<groupId>com.github.sarxos</groupId>
<artifactId>webcam-capture</artifactId>
<version>0.3.12</version>
</dependency>
注:这是一款github上开源的项目,本人整理一个项目中用到的demo以供大家学习参考。
想了解更多信息,请点击链接 https://github.com/sarxos/webcam-capture