Signatur
Beschreibung
Der Konstruktor ImageCapture() gehört zur MediaStream Image Capture API. Er nimmt einen Video-MediaStreamTrack entgegen, typischerweise von navigator.mediaDevices.getUserMedia(), und gibt ein ImageCapture-Objekt zurück, das an genau diese Videoquelle (z. B. eine Kamera) gebunden ist.
Mit dem Objekt stehen zwei Aufnahmewege zur Verfügung:
takePhoto()löst eine echte Fotoaufnahme aus und liefert einenBlob. Je nach Gerät hat das Foto eine höhere Auflösung als der Videostream, und Blitz, Rote-Augen-Reduktion oder Auflösung lassen sich einstellen.grabFrame()nimmt den aktuellen Frame des Videostreams schnell alsImageBitmapauf. Das eignet sich gut für Bildverarbeitung, Canvas-Ausgabe oder Machine Learning.
Außerdem liefern getPhotoCapabilities() und getPhotoSettings() Angaben dazu, was die Kamera unterstützt und wie sie gerade eingestellt ist. Wichtig: Der übergebene Track muss vom Typ "video" sein und darf nicht beendet sein (readyState === "live").
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $videoTrack Pflicht | MediaStreamTrack | Ein Video-Track (kind === "video"), aus dem Bilder aufgenommen werden sollen, z. B. aus stream.getVideoTracks()[0]. |
Rückgabewert
ImageCapture-Objekt, das an den übergebenen Video-Track gebunden ist. Der Track ist über die Eigenschaft track erreichbar.Beispiele
ImageCapture aus der Webcam erzeugen
const startCapture = async () => {
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();
const imageCapture = new ImageCapture(track);
console.log(imageCapture.track.kind, imageCapture.track.readyState);
return imageCapture;
};
startCapture().catch((err) => console.error('Kamera nicht verfügbar:', err));
Foto aufnehmen und im <img> anzeigen
const takeSnapshot = async () => {
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();
const imageCapture = new ImageCapture(track);
const blob = await imageCapture.takePhoto();
const img = document.querySelector('#photo');
img.src = URL.createObjectURL(blob);
console.log(`Foto: ${blob.type}, ${blob.size} Bytes`);
track.stop(); // Kamera wieder freigeben
};
document.querySelector('#snap').addEventListener('click', takeSnapshot);
Frame als ImageBitmap auf Canvas zeichnen (mit Feature-Erkennung)
const drawFrame = async (canvas) => {
if (!('ImageCapture' in window)) {
console.warn('ImageCapture wird nicht unterstützt');
return;
}
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const imageCapture = new ImageCapture(stream.getVideoTracks()[0]);
const bitmap = await imageCapture.grabFrame();
canvas.width = bitmap.width;
canvas.height = bitmap.height;
canvas.getContext('2d').drawImage(bitmap, 0, 0);
bitmap.close();
console.log(`Frame: ${canvas.width}x${canvas.height}`);
};
drawFrame(document.querySelector('canvas'));
Kamera-Fähigkeiten abfragen
const showCapabilities = async () => {
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const imageCapture = new ImageCapture(stream.getVideoTracks()[0]);
const caps = await imageCapture.getPhotoCapabilities();
console.log('Max. Breite:', caps.imageWidth.max);
console.log('Blitzmodi:', caps.fillLightMode);
};
showCapabilities();
// Wichtig · Fallstricke
- Browser-Kompatibilität:
ImageCapturegibt es nur in Chromium-basierten Browsern (Chrome, Edge, Opera, Chrome für Android). Firefox und Safari unterstützen die API nicht. Deshalb vorher mit'ImageCapture' in windowprüfen und notfalls auf<video>pluscanvas.drawImage()ausweichen. - Wird ein Track übergeben, der kein Video-Track ist (z. B. Audio), wirft der Konstruktor einen
NotSupportedError(DOMException); ohne Argument gibt es einenTypeError. getUserMedia()funktioniert nur in einem sicheren Kontext (HTTPS oderlocalhost) und braucht die Kamerafreigabe durch den Nutzer. In iframes muss außerdem die Permissions Policycameraerlaubt sein.- Ist der Track beendet (
track.stop()oderreadyState === "ended"), schlagentakePhoto()undgrabFrame()mitInvalidStateErrorfehl. takePhoto()kann den Videostream kurz unterbrechen oder die Kamera neu einstellen. Für schnelle, wiederholte Aufnahmen istgrabFrame()die bessere Wahl. ZurückgegebeneImageBitmap-Objekte sollten mitclose()freigegeben werden.- Die API ist noch als experimentell gekennzeichnet. Einzelne Fähigkeiten wie Blitz oder Rote-Augen-Reduktion hängen stark vom Gerät ab.