From 54b1447f21e2880a7a04b93452f89cdb7cd3f4bd Mon Sep 17 00:00:00 2001 From: TanerUslu Date: Wed, 29 Jul 2026 15:18:48 +0200 Subject: [PATCH] =?UTF-8?q?Text=20erkennen=20liest=20den=20Zielrahmen=20in?= =?UTF-8?q?=20voller=20Aufl=C3=B6sung,=20nicht=20das=20Vollbild?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit grabFrameRegion() statt grabFrame(): "Modul scannen" bekam bisher das ganze Kamerabild, auf 1280 Pixel herunterskaliert - der Zielrahmen war dabei rein kosmetisch, obwohl er dem Nutzer einen wirksamen Ausschnitt suggeriert. Jetzt liest die Texterkennung genau den Rahmenausschnitt, in nativer Auflösung - denselben, den auch die laufende Barcode-Suche längst benutzt. Die Dateiauswahl (onPickFile) bleibt unverändert beim Vollbild, da sie keinen Zielrahmen kennt. --- src/main.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main.js b/src/main.js index 1b5914e..0497bf8 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,6 @@ // Vollstaendige Verdrahtung der App: Kamera, Barcode/OCR-Erkennung, Sitzung // und Oberflaeche. Ersetzt das fruehere Sichtpruefungs-Geruest vollstaendig. -import { startCamera, grabFrame, grabFrameRegion, imageDataFromFile } from './camera.js'; +import { startCamera, grabFrameRegion, imageDataFromFile } from './camera.js'; import { decodeBarcodes } from './barcode.js'; import { runOcr, isOcrAvailable } from './ocr.js'; import { recognize } from './pipeline.js'; @@ -50,7 +50,13 @@ let cameraUnavailableMessage = null; let currentModeId = null; const view = renderScanView(app, { - onCapture: () => processCapture(() => grabFrame(view.video)), + // "Modul scannen" ist nur in Funktion 3 ("Text erkennen") sichtbar (siehe + // applyMode()/setCaptureVisible) - der Zielrahmen suggeriert dem Nutzer dort + // einen Ausschnitt, den grabFrame() (Vollbild, herunterskaliert) bisher gar + // nicht einloeste. grabFrameRegion() liest genau den Rahmenausschnitt, in + // voller Aufloesung - derselbe Ausschnitt, den auch die Barcode-Dauersuche + // benutzt (siehe runSearchAttempt() weiter unten). + onCapture: () => processCapture(() => grabFrameRegion(view.video)), onUndo: () => { // Waehrend eine Erkennung laeuft, darf kein Eintrag zurueckgenommen // werden - sonst koennte die Rueckgaengig-Flaeche einen Eintrag treffen, @@ -150,7 +156,7 @@ async function processCapture(getFrame) { // selbst (pipeline.js) bleibt unveraendert und kennt keine Funktionen. const { decodeBarcodes: decode, runOcr: recognizeText } = buildRecognitionAdapters(currentModeId, { decodeBarcodes, runOcr }); - const { spec, source, confidence, codes } = await recognize( + const { spec, source, confidence, codes, rawText } = await recognize( frame, { decodeBarcodes: decode, runOcr: recognizeText, isKnownCode }, ); @@ -188,13 +194,25 @@ async function processCapture(getFrame) { if (targetSession !== session) return; const entry = commitAssignment(targetSession, spec, source, stackId, codes); + // entry.rawText ist rein additiv (siehe recognize() in pipeline.js) - + // session.js kennt das Feld nicht und bleibt deshalb unangetastet; es wird + // hier von aussen an den bereits gebuchten Eintrag angehaengt, genau wie + // die Stapelzuordnung selbst nie vom Rohtext abhaengt. + entry.rawText = rawText; view.setLast(describeEntry(spec, entry.stackId)); syncView(); // Nach einer manuellen Entscheidung im Rot-Dialog gibt es nichts mehr // rueckzumelden - der Dialog selbst war die Rueckmeldung. if (confidence !== 'red') { - await showResult(app, { stackId: entry.stackId, spec, confidence }); + // Nur in Funktion 3 ("Text erkennen") ist der erkannte Text lang genug, + // dass er gelesen werden will - dort bleibt die Rueckmeldung deshalb + // stehen, bis der Nutzer sie wegtippt, statt sich nach kurzer Zeit von + // selbst auszublenden (siehe showResult()). In den beiden Barcode- + // Funktionen zaehlt Tempo, dort bleibt es beim automatischen Ausblenden. + await showResult(app, { + stackId: entry.stackId, spec, confidence, rawText, autoHide: currentModeId !== 'ocr', + }); } } catch (error) { failed = true;