From 34adb437d0c994dce1f06a11a31a39d998092bc7 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 9 Mar 2026 23:30:38 +0100 Subject: [PATCH] fix: Bild-Endpoints fallen auf original zurueck fuer Sub-Sessions Alle Bild-Endpoints (cropped, columns-overlay, rows-overlay, words-overlay) suchten nur nach cropped/dewarped. Sub-Sessions haben nur ein original-Bild. Neue Hilfsfunktion _get_base_image_png() mit Fallback-Kette: cropped > dewarped > original. Co-Authored-By: Claude Opus 4.6 --- klausur-service/backend/ocr_pipeline_api.py | 40 ++++++++++++--------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/klausur-service/backend/ocr_pipeline_api.py b/klausur-service/backend/ocr_pipeline_api.py index 9f84987..8aeeae4 100644 --- a/klausur-service/backend/ocr_pipeline_api.py +++ b/klausur-service/backend/ocr_pipeline_api.py @@ -94,6 +94,15 @@ router = APIRouter(prefix="/api/v1/ocr-pipeline", tags=["ocr-pipeline"]) _cache: Dict[str, Dict[str, Any]] = {} +async def _get_base_image_png(session_id: str) -> Optional[bytes]: + """Get the best available base image for a session (cropped > dewarped > original).""" + for img_type in ("cropped", "dewarped", "original"): + png_data = await get_session_image(session_id, img_type) + if png_data: + return png_data + return None + + async def _load_session_to_cache(session_id: str) -> Dict[str, Any]: """Load session from DB into cache, decoding PNGs to BGR arrays.""" session = await get_session_db(session_id) @@ -604,8 +613,11 @@ async def get_image(session_id: str, image_type: str): if image_type == "binarized" and cached.get("binarized_png"): return Response(content=cached["binarized_png"], media_type="image/png") - # Load from DB - data = await get_session_image(session_id, image_type) + # Load from DB — for cropped/dewarped, fall back through the chain + if image_type in ("cropped", "dewarped"): + data = await _get_base_image_png(session_id) + else: + data = await get_session_image(session_id, image_type) if not data: raise HTTPException(status_code=404, detail=f"Image '{image_type}' not available yet") @@ -1398,12 +1410,10 @@ async def _get_columns_overlay(session_id: str) -> Response: if not column_result or not column_result.get("columns"): raise HTTPException(status_code=404, detail="No column data available") - # Load cropped image (preferred) or dewarped as fallback - base_png = await get_session_image(session_id, "cropped") + # Load best available base image (cropped > dewarped > original) + base_png = await _get_base_image_png(session_id) if not base_png: - base_png = await get_session_image(session_id, "dewarped") - if not base_png: - raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)") + raise HTTPException(status_code=404, detail="No base image available") arr = np.frombuffer(base_png, dtype=np.uint8) img = cv2.imdecode(arr, cv2.IMREAD_COLOR) @@ -3160,12 +3170,10 @@ async def _get_rows_overlay(session_id: str) -> Response: if not row_result or not row_result.get("rows"): raise HTTPException(status_code=404, detail="No row data available") - # Load cropped image (preferred) or dewarped as fallback - base_png = await get_session_image(session_id, "cropped") + # Load best available base image (cropped > dewarped > original) + base_png = await _get_base_image_png(session_id) if not base_png: - base_png = await get_session_image(session_id, "dewarped") - if not base_png: - raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)") + raise HTTPException(status_code=404, detail="No base image available") arr = np.frombuffer(base_png, dtype=np.uint8) img = cv2.imdecode(arr, cv2.IMREAD_COLOR) @@ -3247,12 +3255,10 @@ async def _get_words_overlay(session_id: str) -> Response: if not cells and not word_result.get("entries"): raise HTTPException(status_code=404, detail="No word data available") - # Load cropped image (preferred) or dewarped as fallback - base_png = await get_session_image(session_id, "cropped") + # Load best available base image (cropped > dewarped > original) + base_png = await _get_base_image_png(session_id) if not base_png: - base_png = await get_session_image(session_id, "dewarped") - if not base_png: - raise HTTPException(status_code=404, detail="No base image available (cropped/dewarped)") + raise HTTPException(status_code=404, detail="No base image available") arr = np.frombuffer(base_png, dtype=np.uint8) img = cv2.imdecode(arr, cv2.IMREAD_COLOR)