From 5fefdccd17fdbbd8052f7374fba39dbe81b32cd1 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 13 Jul 2026 13:43:06 -0400 Subject: [PATCH] Update video frame capture dimensions to improve OCR accuracy and adjust related styles. Increase button size to 70% width and 40% height for better alignment with the OCR reading area. Increment version code to 4.72.791 to reflect these changes. --- css/style.css | 5 +- js/v2/inscr-gestion.js | 95 +++++++++-------------------- php/inc_fx_inscriptions_gestion.php | 2 +- php/inc_settings.php | 2 +- 4 files changed, 35 insertions(+), 69 deletions(-) diff --git a/css/style.css b/css/style.css index 776e71e..21d8af3 100644 --- a/css/style.css +++ b/css/style.css @@ -3461,8 +3461,9 @@ a.ms1-trad-link.btn-aide-trad{ left:50%; top:50%; transform:translate(-50%,-50%); - width:55%; - height:30%; + /* Guide un peu large : aligne sur la zone OCR (~70% x 40% du flux). */ + width:70%; + height:40%; border:2px solid rgba(255,255,255,.95); border-radius:8px; box-shadow:0 0 0 100vmax rgba(0,0,0,.5); diff --git a/js/v2/inscr-gestion.js b/js/v2/inscr-gestion.js index 4927b95..5b847d0 100644 --- a/js/v2/inscr-gestion.js +++ b/js/v2/inscr-gestion.js @@ -493,78 +493,43 @@ if (!matches || !matches.length) { return ''; } - var num = matches[0]; - // Si plusieurs groupes (bruit OCR), garder le plus long s'il est unique en longueur. - if (matches.length > 1) { - matches.sort(function (a, b) { return b.length - a.length; }); - if (matches[0].length === matches[1].length) { - return ''; + if (matches.length === 1) { + var one = matches[0]; + return (one.length >= 1 && one.length <= BIB_MAX_LEN) ? one : ''; + } + // OCR decoupe souvent un dossard manuscrit en chiffres isoles ("5" "2" "1"). + var allSingles = true; + var i; + for (i = 0; i < matches.length; i++) { + if (matches[i].length !== 1) { + allSingles = false; + break; } - num = matches[0]; } - if (num.length < 1 || num.length > BIB_MAX_LEN) { - return ''; + if (allSingles) { + var joined = matches.join(''); + return (joined.length <= BIB_MAX_LEN) ? joined : ''; } - return num; + // Sinon : le groupe le plus long s'il domine clairement (evite 2 dossards). + var sorted = matches.slice().sort(function (a, b) { return b.length - a.length; }); + if (sorted[0].length <= BIB_MAX_LEN && sorted[0].length > sorted[1].length) { + return sorted[0]; + } + return ''; } - // Rectangle source visible avec object-fit:cover (ce que l'usager voit dans le carre). - function getCoverVisibleRect(videoEl, displayEl) { - var vw = videoEl.videoWidth; - var vh = videoEl.videoHeight; - var dw = displayEl.clientWidth || 1; - var dh = displayEl.clientHeight || 1; - var videoRatio = vw / vh; - var displayRatio = dw / dh; - var renderedW; - var renderedH; - var offsetX; - var offsetY; - if (videoRatio > displayRatio) { - renderedH = vh; - renderedW = vh * displayRatio; - offsetX = (vw - renderedW) / 2; - offsetY = 0; - } else { - renderedW = vw; - renderedH = vw / displayRatio; - offsetX = 0; - offsetY = (vh - renderedH) / 2; - } - return { - offsetX: offsetX, - offsetY: offsetY, - renderedW: renderedW, - renderedH: renderedH - }; - } - - // MSIN-4401 — Crop aligne sur le cadre blanc (~55% x 30% du viseur affiche), - // pas sur le flux brut (sinon object-fit:cover decale / elargit la zone lue). - function captureCenterFrame(videoEl, displayEl) { + // MSIN-4401 — Crop central du flux video (comme avant le polish UI). + // Zone un peu large pour un numero manuscrit entier dans le viseur. + function captureCenterFrame(videoEl) { if (!videoEl || !videoEl.videoWidth) { return null; } - var cropRatioW = 0.55; - var cropRatioH = 0.3; - var sx; - var sy; - var cropW; - var cropH; - if (displayEl && displayEl.clientWidth && displayEl.clientHeight) { - var vis = getCoverVisibleRect(videoEl, displayEl); - cropW = Math.max(1, Math.round(vis.renderedW * cropRatioW)); - cropH = Math.max(1, Math.round(vis.renderedH * cropRatioH)); - sx = Math.round(vis.offsetX + (vis.renderedW - cropW) / 2); - sy = Math.round(vis.offsetY + (vis.renderedH - cropH) / 2); - } else { - var w = videoEl.videoWidth; - var h = videoEl.videoHeight; - cropW = Math.round(w * cropRatioW); - cropH = Math.round(h * cropRatioH); - sx = Math.round((w - cropW) / 2); - sy = Math.round((h - cropH) / 2); - } + var w = videoEl.videoWidth; + var h = videoEl.videoHeight; + var cropW = Math.round(w * 0.7); + var cropH = Math.round(h * 0.4); + var sx = Math.round((w - cropW) / 2); + var sy = Math.round((h - cropH) / 2); var canvas = document.createElement('canvas'); var outW = cropW; var outH = cropH; @@ -750,7 +715,7 @@ if (self.ocrBusy || !self.video || activeScan !== self || !self.workerReady) { return; } - var canvas = captureCenterFrame(self.video, self.captureEl); + var canvas = captureCenterFrame(self.video); if (!canvas) { return; } diff --git a/php/inc_fx_inscriptions_gestion.php b/php/inc_fx_inscriptions_gestion.php index 3e4e81e..acf024f 100644 --- a/php/inc_fx_inscriptions_gestion.php +++ b/php/inc_fx_inscriptions_gestion.php @@ -1482,7 +1482,7 @@ function fxInscrGestionRenderBibScanBlock($strBibInputId, $strLangue) { echo '
'; echo '
'; // Zone-cible centrale (eclaircie) : aligne le repere visuel sur la region - // reellement lue par l'OCR (captureCenterFrame : ~55% largeur x 30% hauteur). + // reellement lue par l'OCR (captureCenterFrame : ~70% largeur x 40% hauteur). echo ''; // Pastille courte (fallback integre) — evite un long texte info qui masque le viseur. echo '' diff --git a/php/inc_settings.php b/php/inc_settings.php index 383e586..6fffd19 100644 --- a/php/inc_settings.php +++ b/php/inc_settings.php @@ -7,7 +7,7 @@ * Constantes * * **************/ -define('_VERSION_CODE', '4.72.790'); +define('_VERSION_CODE', '4.72.791'); define('_DATE_CODE', '2026-07-13'); //MSIN-4290 define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');