Skip to content

feat(image): native format-übergreifende sdata-Metadaten in Bildern (RFC 0005)#76

Merged
lepy merged 1 commit into
masterfrom
feat/native-image-metadata
Jun 29, 2026
Merged

feat(image): native format-übergreifende sdata-Metadaten in Bildern (RFC 0005)#76
lepy merged 1 commit into
masterfrom
feat/native-image-metadata

Conversation

@lepy

@lepy lepy commented Jun 29, 2026

Copy link
Copy Markdown
Owner

Was

sdata bekommt eigenen Code, um Metadaten nativ in Bilddateien zu schreiben
und zu lesen — mit einer API über fünf Container. Bisher konnte Image das nur
für PNG (über Pillows PngInfo).

Neuer Layer sdata/imagemeta.py — reiner Python-Code (Standardbibliothek,
keine Pillow-Abhängigkeit):

Format Träger der sdata-Nutzlast Kennung
PNG iTXt-Chunk vor IEND Keyword sdata
JPEG APP1-Segment hinter SOI sdata\0-Präfix
JP2 uuid-Box (ISO BMFF) vor jp2c feste sdata-UUID
GIF Comment-Extension hinter dem Header sdata\0-Präfix
WebP eigener RIFF-Chunk sdAT FourCC sdAT

Fassade: detect_format / embed / extract / supported_formats. Format-Erkennung
über Magic-Bytes; Replace-Semantik (idempotent); lenient beim Lesen; Registry
erweiterbar (TIFF/… als zwei Funktionen + Eintrag).

Image-Integration

  • save() wählt den Container an der Datei-Endung, bettet ohne Re-Encoding ein,
    wenn der Inhalt schon passt (sonst Pillow-Transkodierung); unbekannte Formate via
    Pillow ohne Einbettung (Warnung).
  • from_file/from_bytes lesen eingebettete Metadaten Pillow-frei zurück.
  • neu: Image.embedded_metadata().

WebP-Entscheidung

Empirisch behält ein zusätzlicher, unbekannter RIFF-Chunk (sdAT) die Dekodier-
Integrität (libwebp/Pillow ignorieren unbekannte Chunks; Größe/Pixel unverändert) —
robuster und einfacher als VP8X+XMP. Trade-off + Zukunft in RFC 0005 §4/§7.

Tests / CI

  • tests/test_imagemeta.py: synthetische Container-Bytes → imagemeta.py
    100 % (Pillow-frei: Replace, fehlende Nutzlast, JPEG-Standalone/Non-FF-Marker,
    JP2-XLBox/LBox==0/malformed-Guard, GIF mit/ohne (Local) Color Table + Nicht-Comment-
    Extensions, WebP-Padding) + Pillow-Round-Trips über alle fünf Formate.
  • tests/test_image.py: einheitliche Image-API über PNG/JPEG/JP2/GIF/WebP + Transkodierung.

Kanonische CI: 594 passed, 7 skipped, imagemeta.py 259/259 100 %,
TOTAL 100 %, mkdocs build --strict grün. (imagemeta.py gemessen; image.py
bleibt in omit.)

Kompatibilität

Strikt additiv; Image-Signaturen unverändert; PNG-Round-Trips kompatibel (jetzt
iTXt statt PngInfo, gleiches sdata-Keyword). RFC 0005 + API-Referenz + Nav ergänzt.

…(RFC 0005)

Neuer Pillow-freier Layer sdata/imagemeta.py bettet sdata-Metadaten nativ in
Bild-Bytes ein bzw. liest sie aus — einheitliche API über fünf Container:

- PNG  -> iTXt-Chunk (Keyword sdata)
- JPEG -> APP1-Segment (Kennung sdata\0)
- JP2  -> uuid-Box (feste sdata-UUID) vor jp2c
- GIF  -> Comment-Extension (Praefix sdata\0)
- WebP -> eigener RIFF-Chunk sdAT (von Decodern ignoriert)

Fassade: detect_format / embed / extract / supported_formats. Replace-Semantik
(idempotent), lenient beim Lesen, Registry erweiterbar. Format-Erkennung ueber
Magic-Bytes; reiner Standardbibliotheks-Code (struct/zlib).

Image nutzt den Layer: save() waehlt den Container an der Endung, bettet ohne
Re-Encoding ein wenn der Inhalt schon passt (sonst Pillow-Transkodierung);
from_file/from_bytes lesen eingebettete Metadaten Pillow-frei zurueck;
neu: Image.embedded_metadata().

imagemeta.py wird gemessen und ist zu 100% durch synthetische Container-Bytes
abgedeckt (Pillow-frei); zusaetzliche Pillow-Round-Trips ueber alle fuenf Formate
sichern die Decodier-Integritaet. image.py bleibt in der Coverage-omit.

RFC 0005 dokumentiert Entwurf und WebP-Entscheidung (sdAT-Chunk statt VP8X+XMP);
API-Referenz + mkdocs-Nav ergaenzt.
@lepy lepy merged commit 9460511 into master Jun 29, 2026
1 of 2 checks passed
@lepy lepy deleted the feat/native-image-metadata branch June 29, 2026 13:47
@codacy-production

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 35 high · 14 minor

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

Results:
49 new issues

Category Results
Documentation 14 minor
Security 35 high

View in Codacy

🟢 Metrics 159 complexity · 0 duplication

Metric Results
Complexity 159
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