Webcam in JavaFX darstellen - Spiderlinker/HS-Harz_Multimedia-Infrastrukturen GitHub Wiki
Das zu erstellende Chat-Programm soll auch eine Video-Funktion beinhalten. Hierfür muss das Bild der Webcam des Benutzers abgefragt, dargestellt und zum Gegenüber übertragen werden. Es soll zunächst geklärt werden, ob es möglich ist, das Bild einer angeschlossenen Webcam in JavaFX darzustellen.
JavaFX bietet keine vorgefertigte Möglichkeit, das Bild einer Webcam in einer Anwendung anzuzeigen.
Eine kurze Recherche hat ergeben, dass ein Projekt zur Darstellung des Webcam-Bildes existiert. Dieses ist unter den folgenden Links zu finden:
Originales GitHub-Projekt: https://github.com/sarxos/webcam-capture GitHub-Projekt mit beispielhafter Anwendung für JavaFX: https://github.com/sarxos/webcam-capture/tree/master/webcam-capture-examples/webcam-capture-javafx bzw. ursprünglich von hier: https://github.com/rakeshbhatt10/WebCamJavaFXSampleSarcoxAPI Maven-Repository: https://mvnrepository.com/artifact/com.github.sarxos/webcam-capture
<dependencies>
<dependency>
<groupId>com.github.sarxos</groupId>
<artifactId>webcam-capture</artifactId>
<version>0.3.12</version>
</dependency>
</dependencies>
Das Projekt bietet allerdings keine native Möglichkeit, die Webcam in einer JavaFX-Anwendung darzustellen. Die Bibliothek stellt nur Methoden und Klassen für die Verwendung in Java Swing bereit. Damit das Bild der Webcam auch in JavaFX angezeigt werden kann, muss noch ein kleiner Workaround geschaffen werden.
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());
webcam.open();
WebcamPanel panel = new WebcamPanel(webcam);
panel.setImageSizeDisplayed(true);
JFrame frame = new JFrame();
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());
webcam.open();
BorderPane root = new BorderPane();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
ImageView view = new ImageView();
root.setCenter(view);
new Thread(()->{
while(true) {
Image fxImage = SwingFXUtils.toFXImage(webcam.getImage(), null);
Platform.runLater(()-> view.setImage(fxImage));
}
}).start();
primaryStage.centerOnScreen();
primaryStage.show();
Der Workaround fordert so häufig wie es geht ein aktuelles Bild der Webcam an. Dieses wird in Form eines BufferedImage
zurückgegeben. Das BufferedImage
kann nun mit Hilfe der SwingFXUtils
in ein Image
(JavaFX) umgewandelt werden und zur Darstellung an das ImageView
übergeben werden. Dieser Vorgang wird fortlaufend wiederholt.
Beachte: while(true)
muss selbstverständlich noch so abgeändert werden, dass die Aktualisierung und das Anzeigen des Bildes gestoppt werden kann.