2

我来找你是因为我有一个奇怪的问题,我没有找到任何解决方案......

我使用网络摄像头构建了一个应用程序,以便拍摄一些照片。

我使用 WebcamCapture 来做到这一点,我没有遇到任何问题。

发生的唯一“奇怪”的事情是:

  • 我使用 JDialog 来制作照片。在其 JFrame 父级中,我在 JLabel 中显示这些照片。

  • 然后,我需要禁用这些 JLabel,我通过调用禁用所有组件的方法来做到这一点。奇怪的是,当我禁用 JLabel 时,JLabel 会显示网络摄像头捕获的最后一个图像。不是最后一张照片,而是最后一张拍摄的照片。

似乎 BufferedImage(由 WebcamPanel 使用)与该问题有关。

这是 SSCE:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamPanel;

@SuppressWarnings("serial")
public class CameraFrame extends JFrame implements ActionListener{

    public Webcam webcam;
    Boolean enabled = true;
    CameraFrame frame;

    private JButton btnSaveVerso;
    private JLabel lblVerso;

    private JButton btnEnable;
    private JButton btnQuit;
    private JPanel mainPanel;
    private WebcamPanel streamPanel;

    public static void main(String[] args){
        CameraFrame frame = new CameraFrame();
        frame.setVisible(true);
    }

    public CameraFrame() {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                setLocationRelativeTo(null);
                setResizable(false);
                setMinimumSize(new Dimension(800, 600));
                setPreferredSize(new Dimension(800,600));
                buildPanel();
                setContentPane(mainPanel);
            }
        });
    }

    public void buildPanel() {
        mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

        Border blackline = BorderFactory.createLineBorder(Color.black, 1, true);

        webcam = Webcam.getDefault();
        webcam.open();

        streamPanel = new WebcamPanel(webcam);
        streamPanel.setPreferredSize(new Dimension(webcam.getViewSize()));
        streamPanel.setMaximumSize(new Dimension(webcam.getViewSize()));

        btnSaveVerso = new JButton("Take pic");
        btnSaveVerso.setActionCommand("take");
        btnSaveVerso.addActionListener(this);

        lblVerso = new JLabel("Here will be the pic taken by the camera");
        lblVerso.setBorder(blackline);

        btnEnable = new JButton("Disable");
        btnEnable.setActionCommand("disable");
        btnEnable.addActionListener(this);

        btnQuit = new JButton("Quit");
        btnQuit.setActionCommand("quit");
        btnQuit.addActionListener(this);

        mainPanel.add(streamPanel);
        mainPanel.add(btnSaveVerso);
        mainPanel.add(lblVerso);
        mainPanel.add(btnEnable);
        mainPanel.add(btnQuit);

    }

    @Override
    public void actionPerformed(final ActionEvent e) {
        Thread newThread = new Thread(){
            public void run(){
                if(e.getActionCommand().equals("take")){
                    ImageIcon icon = new ImageIcon(webcam.getImage().getScaledInstance(100, 150, Image.SCALE_SMOOTH ));
                    lblVerso.setIcon(new ImageIcon(icon.getImage()));
                    lblVerso.revalidate();
                    lblVerso.repaint();
                }
                else if(e.getActionCommand().equals("disable")){
                    if(enabled){
                        lblVerso.setEnabled(false);
                        enabled = false;
                        btnEnable.setText("Enable");
                    }
                    else{
                        lblVerso.setEnabled(true);
                        enabled = true;
                        btnEnable.setText("Disable");
                    }
                }
            }
        };
        newThread.run();
        if(e.getActionCommand().equals("quit")){
            webcam.close();
            this.setVisible(false);
        }
    }
}

我希望你编译它没有问题。不要忘记链接

提前致谢

4

1 回答 1

1

我终于解决了这个问题:你只需要在每张图片后关闭网络摄像头,如下:

BufferedImage picture = webcam.getImage();
webcam.close();
webcam.open();

... Do what you need with picture

(您甚至不需要将 BufferedImage 图片转换为其他类型。)

于 2013-07-12T06:59:21.420 回答