Webcam in JavaFX darstellen - Spiderlinker/HS-Harz_Multimedia-Infrastrukturen GitHub Wiki

Ausgangssituation

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.

Möglichkeiten von JavaFX

JavaFX bietet keine vorgefertigte Möglichkeit, das Bild einer Webcam in einer Anwendung anzuzeigen.

Externe Bibliotheken

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.

Beispielhafte Anwendung für Java Swing:

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);

Beispielhafte Anwendung für JavaFX:

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.

⚠️ **GitHub.com Fallback** ⚠️