JPEG
verrät am meistenEine JPEG-Datei speichert ihre Metadaten in APPn-Segmenten, zwischen Dateikopf und Bilddaten. Hier siehst du, was wo liegt und was PicScrub mit jedem Teil macht.
Was entfernt wird
- EXIF GPS-Koordinaten, Kameramarke und -modell, Zeitstempel, Belichtungseinstellungen
- XMP Bearbeitungsverlauf, verwendete Software, Bewertungen
- IPTC / Photoshop Bildunterschriften, Credits, Schlagwörter
- Kommentare und eingebettete Vorschaubilder eine winzige Kopie des Originals, die deine Zuschnitte überleben kann
Was du behalten kannst
- Bilddaten immer unangetastet, nie neu kodiert
- ICC-Farbprofil optional, damit die Farben stimmen
- Ausrichtung optional, damit Porträts aufrecht bleiben
- Copyright-Hinweis optional, für Fotografen, die Credit ohne Koordinaten wollen
Überblick über die Dateistruktur
Wer schon einmal ein JPEG in einem Hex-Editor geöffnet hat, weiß: Die Datei besteht aus Segmenten, die durch Marker getrennt sind. Jeder Marker beginnt mit 0xFF, gefolgt von einem Byte, das den Segmenttyp angibt. Dieser Aufbau macht JPEGs vergleichsweise leicht auswertbar. Du suchst einfach nach FF-Bytes und schaust, was darauf folgt.
Für den Datenschutz ist entscheidend, dass sämtliche Metadaten (EXIF, GPS, Zeitstempel) in diesen Segmenten liegen, vollständig getrennt von den eigentlichen Bilddaten. Genau deshalb können wir Metadaten entfernen, ohne die Pixel anzufassen oder irgendetwas neu zu komprimieren.
Struktur einer JPEG-Datei
Beispiel für einen JPEG-Header
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Aufbau eines Markers
FF xx:Marker (xx gibt den Typ an)LL LL:Länge (2 Bytes, Big-Endian, inklusive sich selbst)Data...:Segmentdaten (Länge - 2 Bytes)
Vollständige JPEG-Marker-Referenz
| Marker | Name | Beschreibung |
|---|---|---|
| FF D8 | SOI | Bildanfang |
| FF D9 | EOI | Bildende |
| FF C0 | SOF0 | Beginn des Frames (Baseline DCT) |
| FF C2 | SOF2 | Beginn des Frames (Progressive DCT) |
| FF C4 | DHT | Huffman-Tabelle definieren |
| FF DB | DQT | Quantisierungstabelle definieren |
| FF DD | DRI | Restart-Intervall definieren |
| FF DA | SOS | Beginn des Scans (danach folgen die Bilddaten) |
| FF FE | COM | Kommentar (Metadaten) |
| FF E0 | APP0 | JFIF-Marker |
| FF E1 | APP1 | EXIF-/XMP-Marker |
| FF E2 | APP2 | ICC-Profil / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Adobe-Farbtransformation |
Gold = Metadaten (werden entfernt), ohne Markierung = Struktur, die erhalten bleibt
JFIF und EXIF im Vergleich
Etwas, das viele überrascht: JPEG-Dateien enthalten oft zwei verschiedene Metadatenstandards gleichzeitig. JFIF kam zuerst und regelt Grundlegendes wie die Auflösung. Später begannen Kameras, EXIF-Daten mit allen Details zur Aufnahme zu ergänzen. Die meisten modernen JPEGs enthalten beides, weshalb du am Dateianfang sowohl APP0- als auch APP1-Marker findest.
APP0:JFIF
JPEG File Interchange Format. Grundlegende Bildinformationen.
- • Versionsnummer
- • Pixeldichte (DPI)
- • Seitenverhältnis
- • Optionales Vorschaubild
APP1:EXIF
Exchangeable Image File Format. Metadaten der Kamera.
- • Kamerahersteller/-modell
- • GPS-Koordinaten
- • Zeitstempel
- • Belichtungseinstellungen
APP-Marker im Detail
Die JPEG-Spezifikation hat 16 „Application“-Marker (APP0 bis APP15) reserviert, die Hersteller frei nutzen dürfen. Im Lauf der Jahre haben verschiedene Organisationen einzelne Marker für ihre Metadatenformate belegt. Das Ergebnis ist ein ziemliches Durcheinander, immerhin aber ein gut dokumentiertes.
Knifflig ist, dass derselbe Marker je nach Inhalt etwas anderes bedeuten kann. APP1 kann zum Beispiel EXIF- oder XMP-Daten enthalten. Erst die Kennung im Inneren verrät dir, womit du es zu tun hast.
APP0 (0xFFE0):JFIF
Kennung: JFIF\0. Enthält Version, Einheit der Pixeldichte, X-/Y-Dichte und optional ein eingebettetes Vorschaubild. In der Regel unbedenklich.
APP1 (0xFFE1):EXIF
Kennung: Exif\0\0. Enthält eine vollständige TIFF-Struktur mit IFD-Einträgen für Kamerainfos, GPS-Daten, Zeitstempel, Vorschaubilder und Maker Notes. Das größte Datenschutzrisiko.
APP1 (0xFFE1):XMP
Kennung: http://ns.adobe.com/xap/1.0/\0. XML-basierter Metadatenstandard von Adobe. Kann Bearbeitungsverlauf, Software-Infos und erweiterte EXIF-Daten enthalten.
XMP-Namespaces
xmp: http://ns.adobe.com/xap/1.0/xmpMM: http://ns.adobe.com/xap/1.0/mm/dc: http://purl.org/dc/elements/1.1/photoshop: http://ns.adobe.com/photoshop/1.0/tiff: http://ns.adobe.com/tiff/1.0/exif: http://ns.adobe.com/exif/1.0/APP1 (0xFFE1):Extended XMP
Kennung: http://ns.adobe.com/xmp/extension/\0. Für XMP-Daten über 65 KB, aufgeteilt auf mehrere APP1-Segmente.
APP2 (0xFFE2):MPF
Kennung: MPF\0. Multi-Picture Format für stereoskopische Bilder und Panoramen.
APP2 (0xFFE2):ICC-Profil
Kennung: ICC_PROFILE\0. Daten zum Farbmanagement. Können auf mehrere APP2-Marker aufgeteilt sein. Meist unbedenklich und erhaltenswert.
APP13 (0xFFED):IPTC/Photoshop
Kennung: Photoshop 3.0\0. Enthält IPTC-IIM-Daten mit Bildunterschriften, Schlagwörtern, Copyright und Angaben zum Urheber. Kann personenbezogene Informationen enthalten.
APP14 (0xFFEE):Adobe
Kennung: Adobe\0. Enthält Flags zur Farbtransformation (RGB/CMYK). Wichtig für die korrekte Farbdarstellung.
Der Aufbau von EXIF
Jetzt wird es interessant (und ein bisschen kurios): EXIF-Daten sind tatsächlich eine winzige TIFF-Datei, eingebettet in dein JPEG. Ja, wirklich. Sie hat einen eigenen Header, eine eigene Byte-Reihenfolge und nutzt die IFD-Struktur (Image File Directory) von TIFF, um Tags zu speichern.
Direkt nach der Kennung „Exif“ folgt ein TIFF-Header, der angibt, ob die Daten Little-Endian (Intel, „II“) oder Big-Endian (Motorola, „MM“) vorliegen. Wer das falsch interpretiert, erhält nur Zahlensalat. Deshalb prüft jeder Parser das als Allererstes.
TIFF-Header (8 Bytes)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (Little-Endian), MM = Motorola (Big-Endian)
Aufbau eines IFD-Eintrags (12 Bytes)
Wichtige IFD-Einträge
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteSo verarbeitet PicScrub JPEG
Das Vorgehen ist ziemlich geradlinig: Wir lesen die Datei Marker für Marker, behalten alles, was zur Darstellung des Bildes nötig ist, und überspringen alles, was Metadaten enthält. Da wir die komprimierten Bilddaten nie anfassen, entsteht kein Qualitätsverlust.
Entscheidend ist, dass die markerbasierte Struktur von JPEG das leicht macht. Wir müssen weder DCT-Koeffizienten noch Huffman-Tabellen verstehen. Wir müssen nur erkennen, welche Segmente Metadaten sind und welche nicht.
Header prüfen
SOI-Marker (FF D8) am Dateianfang verifizieren
Marker auslesen
Jeden Marker der Reihe nach lesen und Typ sowie Länge ermitteln
Metadaten identifizieren
Kennungen in den APP-Segmenten prüfen (EXIF, XMP, IPTC usw.)
Selektiv kopieren
Segmente ohne Metadaten in die Ausgabe kopieren, Metadaten-Segmente überspringen
Was erhalten bleibt
- • SOI-/EOI-Marker (erforderlich)
- • DQT (Quantisierungstabellen)
- • SOF (Frame-Header)
- • DHT (Huffman-Tabellen)
- • SOS und Scan-Daten (das eigentliche Bild)
- • Optional: ICC-Farbprofil (einstellbar)
Was entfernt wird
- • APP1 EXIF (Kamera, GPS, Zeitstempel)
- • APP1 XMP (Bearbeitungs-Metadaten)
- • APP13 IPTC (Bildunterschriften, Urheber)
- • COM-Marker (Kommentare)
- • EXIF-Vorschaubilder
EXIF-Tag-Referenz
Nicht alle EXIF-Tags sind aus Datenschutzsicht gleich heikel. Manche, etwa die Belichtungseinstellungen, sind harmlos. Andere, etwa Seriennummern und Besitzernamen, können dich oder deine Ausrüstung eindeutig identifizieren. Diese Tags stufen wir als besonders riskant ein:
| Tag-ID | Name | Datenschutzrisiko |
|---|---|---|
| 0x9003 | DateTimeOriginal | Hoch |
| 0x9004 | DateTimeDigitized | Hoch |
| 0x9010 | OffsetTime | Mittel |
| 0x9286 | UserComment | Hoch |
| 0x927C | MakerNote | Hoch |
| 0xA420 | ImageUniqueID | Hoch |
| 0xA430 | CameraOwnerName | Hoch |
| 0xA431 | BodySerialNumber | Hoch |
| 0xA434 | LensModel | Mittel |
| 0xA435 | LensSerialNumber | Hoch |
| 0xFDE8 | OwnerName | Hoch |
| 0xFDE9 | SerialNumber | Hoch |
Alle Tags zu Kameraeinstellungen anzeigen (nicht identifizierend)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeGPS-Tag-Referenz
GPS-Daten liegen in einem eigenen Sub-IFD, auf das das Tag 0x8825 im Haupt-IFD verweist. Existiert dieser Zeiger, enthält dein Bild Standortdaten. Besonders Smartphones betten das sehr bereitwillig ein, oft so präzise, dass sich exakt bestimmen lässt, wo du gestanden hast.
| Tag-ID | Name | Beschreibung |
|---|---|---|
| 0x0000 | GPSVersionID | Version der GPS-Tags |
| 0x0001 | GPSLatitudeRef | N oder S |
| 0x0002 | GPSLatitude | Grad, Minuten, Sekunden |
| 0x0003 | GPSLongitudeRef | E oder W |
| 0x0004 | GPSLongitude | Grad, Minuten, Sekunden |
| 0x0005 | GPSAltitudeRef | Über/unter dem Meeresspiegel |
| 0x0006 | GPSAltitude | Meter |
| 0x0007 | GPSTimeStamp | UTC-Uhrzeit |
| 0x001D | GPSDateStamp | UTC-Datum |
| 0x0012 | GPSMapDatum | Geodätisches Bezugssystem |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Name des Ortes |
IPTC-Tag-Referenz
IPTC wurde für Nachrichtenagenturen entwickelt, um Bildunterschriften, Credits und Copyright-Angaben einzubetten. Die Daten liegen in APP13 mit der Kennung „Photoshop 3.0“ (ja, Adobe hat den Standard übernommen). Wenn du jemals Copyright-Angaben oder Schlagwörter in Lightroom oder Photoshop gesetzt hast, landen sie genau hier.
0x0250 By-line (Urheber)0x0255 By-line Title0x025A City (Ort)0x025C Sub-location0x025F Province/State0x0265 Country Name0x0274 Copyright Notice0x0276 Contact0x0237 Date Created0x023C Time Created0x0278 Caption/Abstract0x0219 Keywords