我正在尝试从网络摄像头获取输入并在画布中绘制。
为此,我写了以下代码块:
void addImageToCanvas(Image img){
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
}
如果我手动只通过该功能中的一个图像,则可以正常工作。
如果我传递了两个Image
,那么它只会绘制最后一个。
但我正在实现线程并从线程中不断调用它。然后该功能停在线上:
gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
调用方法的代码部分:
public void run() {
try {
FrameGrabber grabber = new VideoInputFrameGrabber(cameraId);
CvMemStorage storage = CvMemStorage.create();
grabber.start();
IplImage grabbedImage;
BufferedImage bufImg;
int counter = 0;
while (primaryCameraChosen != null) {
grabbedImage = grabber.grab();
bufImg = grabbedImage.getBufferedImage();
addImageToCanvas(SwingFXUtils.toFXImage(bufImg, null));
try{
Thread.sleep(10000);
} catch(InterruptedException e){}
}
grabber.stop();
grabber.release();
} catch (Exception ex) {
}
}
你可以告诉我这里我做错了什么吗?解决办法是什么?感谢。
答案 0 :(得分:2)
所以你实际上有两个问题
1)如果我传递两张图片,那么它只会绘制最后一张图片。
您正在将图像绘制到相同的X,Y坐标,具有相同的高度和宽度。结果是(就像在现实生活中,如果你在现有的绘画上画一些东西)只有最后一幅画是可见的,因为它隐藏了第一张。这是预期的工作。
OP发表评论后更新:
这一行的问题:gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
是,它在第一个Image
尝试使用Image
的实际高度和宽度绘制Canvas
,但是最有可能的是,此时Canvas
本身并未绘制,因此实际的高度和宽度均为零,因此图片的宽度和高度均为零。
两种可能的解决方案是:
1)仅在包含Thread
的{{1}}实际显示时才启动Stage
。这将确保Canvas
即使在第一张图片中也具有正确的高度和宽度。
2)聆听画布的宽度和高度变化,并根据需要重绘Canvas
。这将确保无论何时调整画布大小,都会重新绘制Image
(它的优点是图片始终适合屏幕,因此这是建议的方式)
该示例包含两种方法。
2)但我正在实施线程并从中连续调用它 线。然后该功能停在线上
我们将看到完整的代码可能出错,但在您更新帖子以包含检测问题所需的每个部分之前,以下是一个使用Image
从背景更新画布的示例每3秒线程一次:
Image