import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import com.github.sarxos.webcam.Webcam; import com.github.sarxos.webcam.WebcamPanel; import com.github.sarxos.webcam.WebcamResolution; @SuppressWarnings("serial") public class TakeSnapshotFromVideoExample extends JFrame { private class SnapMeAction extends AbstractAction { public SnapMeAction() { super("Snapshot"); } @Override public void actionPerformed(ActionEvent e) { try { for (int i = 0; i < webcams.size(); i++) { Webcam webcam = webcams.get(i); File file = new File(String.format("test-%d.jpg", i)); ImageIO.write(webcam.getImage(), "JPG", file); System.out.format("Image for %s saved in %s \n", webcam.getName(), file); } } catch (IOException e1) { e1.printStackTrace(); } } } private class StartAction extends AbstractAction implements Runnable { public StartAction() { super("Start"); } @Override public void actionPerformed(ActionEvent e) { btStart.setEnabled(false); btSnapMe.setEnabled(true); // remember to start panel asynchronously - otherwise GUI will be // blocked while OS is opening webcam HW (will have to wait for // webcam to be ready) and this causes GUI to hang, stop responding // and repainting executor.execute(this); } @Override public void run() { btStop.setEnabled(true); for (WebcamPanel panel : panels) { panel.start(); } } } private class StopAction extends AbstractAction { public StopAction() { super("Stop"); } @Override public void actionPerformed(ActionEvent e) { btStart.setEnabled(true); btSnapMe.setEnabled(false); btStop.setEnabled(false); for (WebcamPanel panel : panels) { panel.stop(); } } } private Executor executor = Executors.newSingleThreadExecutor(); private Dimension size = WebcamResolution.QQVGA.getSize(); private List<Webcam> webcams = Webcam.getWebcams(); private List<WebcamPanel> panels = new ArrayList<WebcamPanel>(); private JButton btSnapMe = new JButton(new SnapMeAction()); private JButton btStart = new JButton(new StartAction()); private JButton btStop = new JButton(new StopAction()); public TakeSnapshotFromVideoExample() { super("Test Snap Different Size"); for (Webcam webcam : webcams) { webcam.setViewSize(size); WebcamPanel panel = new WebcamPanel(webcam, size, false); panel.setFPSDisplayed(true); panel.setFillArea(true); panels.add(panel); } // start application with disable snapshot button - we enable it when // webcam is started btSnapMe.setEnabled(false); btStop.setEnabled(false); setLayout(new FlowLayout()); for (WebcamPanel panel : panels) { add(panel); } add(btSnapMe); add(btStart); add(btStop); pack(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new TakeSnapshotFromVideoExample(); } }