From b5d5371f724d8c6c23e0ed4d916b662f8a227cb9 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Wed, 11 Mar 2026 09:34:41 +0100 Subject: [PATCH] fix: einheitliche Schriftgroesse + Border-Cluster-Filter im Overlay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Schriftgroesse basiert jetzt auf Median-Zeilenhoehe statt individueller Zellhoehe — keine Groessensprunge in Box-Bereichen 2. Sehr schmale Pixel-Cluster (< 0.5% Zellbreite) werden gefiltert, damit Box-Rahmen nicht als Textposition erkannt werden Co-Authored-By: Claude Opus 4.6 --- .../ocr-overlay/OverlayReconstruction.tsx | 13 ++++++++++--- .../components/ocr-overlay/usePixelWordPositions.ts | 5 +++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/admin-lehrer/components/ocr-overlay/OverlayReconstruction.tsx b/admin-lehrer/components/ocr-overlay/OverlayReconstruction.tsx index 3161926..2b712f5 100644 --- a/admin-lehrer/components/ocr-overlay/OverlayReconstruction.tsx +++ b/admin-lehrer/components/ocr-overlay/OverlayReconstruction.tsx @@ -316,6 +316,14 @@ export function OverlayReconstruction({ sessionId, onNext }: OverlayReconstructi const imgH = imageNaturalSize?.h || 1 const containerH = reconWidth * (imgH / imgW) + // Compute median cell height (in px) for consistent font sizing + const medianCellHeightPx = useMemo(() => { + if (cells.length === 0) return 40 + const heights = cells.map(c => containerH * (c.bboxPct.h / 100)).sort((a, b) => a - b) + const mid = Math.floor(heights.length / 2) + return heights.length % 2 === 0 ? (heights[mid - 1] + heights[mid]) / 2 : heights[mid] + }, [cells, containerH]) + return (
{/* Toolbar */} @@ -460,13 +468,12 @@ export function OverlayReconstruction({ sessionId, onNext }: OverlayReconstructi const edited = isEdited(cell) const wordPos = cellWordPositions.get(cell.cellId) const bboxPct = cell.bboxPct - const cellHeightPx = containerH * (bboxPct.h / 100) const colorValue = textColor === 'black' ? '#1a1a1a' : textColor // Pixel-analysed: render word-groups at detected positions if (wordPos && wordPos.length > 0) { return wordPos.map((wp, i) => { - const autoFontPx = cellHeightPx * wp.fontRatio * fontScale + const autoFontPx = medianCellHeightPx * wp.fontRatio * fontScale const fs = Math.max(6, autoFontPx) if (wordPos.length > 1) { @@ -536,7 +543,7 @@ export function OverlayReconstruction({ sessionId, onNext }: OverlayReconstructi // Fallback: no pixel data — single input at cell bbox if (!cell.text) return null - const fontSize = Math.max(6, cellHeightPx * fontScale) + const fontSize = Math.max(6, medianCellHeightPx * fontScale) return (
(c.end - c.start + 1) > minClusterW) + if (clusters.length === 0) continue + if (rotation === 180) { clusters = clusters.map(c => ({ start: cw - 1 - c.end,