Skip to content

feat(imagemeta): TIFF-Handler (privates IFD-Tag, ohne Offset-Chirurgie)#78

Merged
lepy merged 1 commit into
masterfrom
feat/imagemeta-tiff
Jun 29, 2026
Merged

feat(imagemeta): TIFF-Handler (privates IFD-Tag, ohne Offset-Chirurgie)#78
lepy merged 1 commit into
masterfrom
feat/imagemeta-tiff

Conversation

@lepy

@lepy lepy commented Jun 29, 2026

Copy link
Copy Markdown
Owner

Was

Sechster Container in der imagemeta-Registry: TIFF (LE/BE, klassisches TIFF).

TIFF ist offset-basiert (IFD), Einbetten erfordert normalerweise heikle Offset-
Relokation (StripOffsets u. a.). Stattdessen: Original-Bytes bleiben unverändert
→ eine Kopie der ersten IFD, ergänzt um ein privates Tag (65000) mit der Nutzlast,
wird ans Dateiende angehängt und der Header darauf umgelenkt. So bleiben alle
bestehenden Offsets gültig — keine Offset-Chirurgie.

  • Little- und Big-Endian (II/MM, Magic 42); BigTIFF (Magic 43) ist nicht abgedeckt.
  • Nutzlast inline (≤4 Byte) oder per Offset (sonst).
  • Replace-Semantik (logisch): erneutes Einbetten ersetzt die aktive Nutzlast;
    verwaiste Vorgänger-Bytes bleiben ungenutzt im File (kein Re-Pack).
  • detect_format"tiff"; supported_formats() jetzt 6 Formate.
  • Image._SUFFIX_FORMATS: tif/tiff("TIFF", "tiff").

Warum diese Strategie

Empirisch verifiziert: nach dem Einbetten liest Pillow das Bild korrekt (Größe/Pixel
erhalten) und toleriert das private Tag; unsere extract liest die Nutzlast Pillow-frei.
StripOffsets bleiben gültig, weil die Originaldaten nicht verschoben werden.

Tests / CI

  • tests/test_imagemeta.py: LE+BE embed/extract, replace, tiny-inline (≤4 B), absent —
    alles synthetisch (Pillow-frei) → imagemeta.py 311/311 100 %.
  • tests/test_image.py: Real-Pillow-TIFF im Cross-Format-Round-Trip (einheitliche API).

Kanonische CI: 601 passed, 7 skipped, TOTAL 100 %, mkdocs build --strict grün.

Docs

RFC 0005 + Usage-Guide auf TIFF aktualisiert (Tabellen, §3.2-Detail, Status; TIFF von
„Zukunft" → implementiert; BMP/BigTIFF bleiben als Registry-Erweiterungen offen).

Sechster Container in der imagemeta-Registry: TIFF. Statt fehleranfaelliger
Offset-Relokation bleiben die Original-Bytes unveraendert (alle bestehenden
Offsets inkl. StripOffsets gueltig): eine Kopie der ersten IFD — ergaenzt um ein
privates Tag (65000) mit der Nutzlast — wird ans Dateiende angehaengt und der
Header darauf umgelenkt. Little- und Big-Endian (II/MM, klassisches TIFF/Magic 42);
BigTIFF (Magic 43) nicht abgedeckt. Replace-Semantik (logisch; verwaiste Bytes
bleiben ungenutzt). Nutzlast inline (<=4 Byte) oder per Offset.

- detect_format erkennt II*\0 / MM\0* -> "tiff"; supported_formats jetzt 6 Formate
- Image._SUFFIX_FORMATS: tif/tiff -> ("TIFF","tiff")
- Tests: LE+BE embed/extract, replace, tiny-inline, absent; Real-Pillow-TIFF im
  Cross-Format-Round-Trip. imagemeta.py 311/311 100% (synthetisch, Pillow-frei)
- RFC 0005 + Usage-Guide auf TIFF aktualisiert (von "Zukunft" -> implementiert)

Kanonische CI: 601 passed, 7 skipped, TOTAL 100%; mkdocs --strict gruen.
@lepy lepy merged commit 290dd90 into master Jun 29, 2026
1 check passed
@lepy lepy deleted the feat/imagemeta-tiff branch June 29, 2026 14:07
@codacy-production

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 6 high · 2 minor

Alerts:
⚠ 8 issues (≤ 0 issues of at least minor severity)

Results:
8 new issues

Category Results
Documentation 2 minor
Security 6 high

View in Codacy

🟢 Metrics 26 complexity · 0 duplication

Metric Results
Complexity 26
Duplication 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant