我已使用com.github.sarxos.webcam
向我的软件添加了网络摄像头。它有一个名为JPanel
的{{1}},并且具有预定义的网络摄像头大小,而我需要自定义尺寸的图片。我设法在WebcamPanel
裁剪从网络摄像头拍摄的图像。我想在640 x 480
上放一个红色矩形,表示图片的这一部分将被保存。
WebcamPanel
我使用了public class CardPanel {
Dimension panelDim = new Dimension(640, 480);
public Cardpanel(){
//....Button Defined earlier
btnTakePhoto.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
webcameFrame();
}
});
}
private void webcamFrame(){
imageFrame = new JFrame("Photo Capture");
// Did some calculations to put window at center
imageFrame.setBounds(screenSize.width / 2 - frameWidth / 2, screenSize.height / 2 - frameHeight / 2, frameWidth,
frameHeight);
imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
imageFrame.setContentPane(contentPane);
JPanel webcamWindow = new JPanel();
RedHighlighter redHighlighter = new RedHighlighter();
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());
webcamPanel = new WebcamPanel(webcam);
webcamPanel.setFillArea(true);
webcamPanel.setMirrored(false);
webcamPanel.setPreferredSize(panelDim);
webcamWindow.add(webcamPanel);
webcamWindow.add(redHighlighter);
hBox.add(webcamWindow);
}
// Sub Class just for drawing the rectangle
public class RedHighlighter extends JPanel{
public RedHighlighter() {
// If you delete the following line, nothing will appear
setPreferredSize(new Dimension(400, 400));
}
@Override
public void paint(Graphics g) {
g.setColor(Color.RED);
g.drawRect(100, 100, 200, 200);
}
}
}
,但无论你做什么,它都将覆盖整个尺寸,并且一次只显示一个项目。
覆盖JLayeredPanes
方法帮助我绘制矩形,但它在侧面而不在顶部。
如您所见,矩形向左推动paint
。我希望WebcamPanel
保持在它的位置,而它上面的矩形位于中心。请建议一个有效的方法来解决这个问题。谢谢!
答案 0 :(得分:2)
由于您正在使用的布局管理器,正在推动一个JPanel。如果你想让一个JPanel过度使用另一个JPanel,你会考虑使用JLayeredPane,视频图像位于较低级别,可能是JLayeredPane.DEFAULT
图层,也可以是上面的绘图JPanel。
其他选项和问题:
答案 1 :(得分:0)
有效!
public class MyWebcamPanel extends WebcamPanel {
/**
*
*/
private static final long serialVersionUID = 2808353446021354508L;
public MyWebcamPanel(Webcam webcam) {
super(webcam);
}
@Override
protected void paintComponent(Graphics g) {
int x = 180;
int y = 87;
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(x, y, 640-2*x, 480-2*y);
}
}