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.
This commit is contained in:
@@ -15,7 +15,14 @@ export async function startCamera(videoElement) {
|
|||||||
|
|
||||||
videoElement.srcObject = stream;
|
videoElement.srcObject = stream;
|
||||||
videoElement.setAttribute('playsinline', '');
|
videoElement.setAttribute('playsinline', '');
|
||||||
|
|
||||||
|
try {
|
||||||
await videoElement.play();
|
await videoElement.play();
|
||||||
|
} catch (error) {
|
||||||
|
for (const track of stream.getTracks()) track.stop();
|
||||||
|
videoElement.srcObject = null;
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
stop() {
|
stop() {
|
||||||
@@ -38,8 +45,17 @@ function drawScaled(source, sourceWidth, sourceHeight, maxEdge) {
|
|||||||
return context.getImageData(0, 0, width, height);
|
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. */
|
/** Einzelbild aus dem laufenden Kamerastrom. */
|
||||||
export function grabFrame(videoElement, maxEdge = 1280) {
|
export function grabFrame(videoElement, maxEdge = 1280) {
|
||||||
|
assertHasSize(videoElement.videoWidth, videoElement.videoHeight);
|
||||||
return drawScaled(
|
return drawScaled(
|
||||||
videoElement,
|
videoElement,
|
||||||
videoElement.videoWidth,
|
videoElement.videoWidth,
|
||||||
@@ -51,6 +67,7 @@ export function grabFrame(videoElement, maxEdge = 1280) {
|
|||||||
/** Ersatzweg ohne Kamera: Bilddatei auswaehlen (z. B. am Rechner). */
|
/** Ersatzweg ohne Kamera: Bilddatei auswaehlen (z. B. am Rechner). */
|
||||||
export async function imageDataFromFile(file, maxEdge = 1280) {
|
export async function imageDataFromFile(file, maxEdge = 1280) {
|
||||||
const bitmap = await createImageBitmap(file);
|
const bitmap = await createImageBitmap(file);
|
||||||
|
assertHasSize(bitmap.width, bitmap.height);
|
||||||
const data = drawScaled(bitmap, bitmap.width, bitmap.height, maxEdge);
|
const data = drawScaled(bitmap, bitmap.width, bitmap.height, maxEdge);
|
||||||
bitmap.close();
|
bitmap.close();
|
||||||
return data;
|
return data;
|
||||||
|
|||||||
Reference in New Issue
Block a user