JavaFX Canvas不是绘制图像

时间:2016-06-08 07:24:46

标签: java canvas javafx webcam

我正在尝试从网络摄像头获取输入并在画布中绘制。

为此,我写了以下代码块:

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) {
        }
}
你可以告诉我这里我做错了什么吗?解决办法是什么?感谢。

1 个答案:

答案 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