From 91ac8b9db6947e94f982b6b8f6f8d06823b4c90f Mon Sep 17 00:00:00 2001 From: vchuser Date: Tue, 28 Jul 2026 16:25:06 +0200 Subject: [PATCH] Kamerastrom bei Fehler freigeben, klare Meldung bei fehlenden Bildmassen - startCamera: schlaegt play() fehl, werden Tracks gestoppt und srcObject geloest, bevor der Fehler weitergereicht wird (Kamera-LED erlischt statt dauerhaft aktiv zu bleiben). - grabFrame/imageDataFromFile: pruefen vor dem Verkleinern, ob Breite und Hoehe > 0 sind, und werfen sonst eine verstaendliche deutsche Meldung statt eines technischen Fehlers aus getImageData. --- src/camera.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/camera.js b/src/camera.js index 8041a9e..cf20f73 100644 --- a/src/camera.js +++ b/src/camera.js @@ -15,7 +15,14 @@ export async function startCamera(videoElement) { videoElement.srcObject = stream; videoElement.setAttribute('playsinline', ''); - await videoElement.play(); + + try { + await videoElement.play(); + } catch (error) { + for (const track of stream.getTracks()) track.stop(); + videoElement.srcObject = null; + throw error; + } return { stop() { @@ -38,8 +45,17 @@ function drawScaled(source, sourceWidth, sourceHeight, maxEdge) { return context.getImageData(0, 0, width, height); } +function assertHasSize(width, height) { + if (!(width > 0) || !(height > 0)) { + throw new Error( + 'Das Kamerabild ist noch nicht bereit. Bitte gleich noch einmal versuchen.', + ); + } +} + /** Einzelbild aus dem laufenden Kamerastrom. */ export function grabFrame(videoElement, maxEdge = 1280) { + assertHasSize(videoElement.videoWidth, videoElement.videoHeight); return drawScaled( videoElement, videoElement.videoWidth, @@ -51,6 +67,7 @@ export function grabFrame(videoElement, maxEdge = 1280) { /** Ersatzweg ohne Kamera: Bilddatei auswaehlen (z. B. am Rechner). */ export async function imageDataFromFile(file, maxEdge = 1280) { const bitmap = await createImageBitmap(file); + assertHasSize(bitmap.width, bitmap.height); const data = drawScaled(bitmap, bitmap.width, bitmap.height, maxEdge); bitmap.close(); return data;