JPEG
ten przecieka najbardziejPlik JPEG trzyma metadane w segmentach APPn, między nagłówkiem pliku a danymi obrazu. Oto co gdzie siedzi i co PicScrub robi z każdą częścią.
Co usuwamy
- EXIF współrzędne GPS, marka i model aparatu, data i godzina, ustawienia ekspozycji
- XMP historia edycji, użyte oprogramowanie, oceny
- IPTC / Photoshop podpisy, autorzy, słowa kluczowe
- Komentarze i osadzone miniatury malutka kopia oryginału, która potrafi przetrwać twoje kadrowanie i poprawki
Co możesz zachować
- Dane obrazu zawsze nietknięte, nigdy nie kodowane od nowa
- Profil koloru ICC opcjonalnie, żeby kolory pozostały wierne
- Orientacja opcjonalnie, żeby pionowe zdjęcia się nie przewracały
- Informacja o prawach autorskich opcjonalnie, dla fotografów, którzy chcą podpisu bez współrzędnych
Struktura pliku w skrócie
Jeśli zdarzyło ci się otworzyć plik JPEG w edytorze heksadecymalnym, wiesz, że składa się z segmentów oddzielonych markerami. Każdy marker zaczyna się od 0xFF, a po nim idzie bajt mówiący, jakiego rodzaju to segment. Dzięki temu JPEG jest stosunkowo łatwy do przeanalizowania: wystarczy szukać bajtów FF i sprawdzać, co idzie dalej.
Z punktu widzenia prywatności najciekawsze jest to, że wszystkie metadane (EXIF, GPS, data i godzina) siedzą właśnie w tych segmentach, całkowicie oddzielone od samych danych obrazu. Dlatego możemy usunąć metadane, nie ruszając pikseli i niczego nie kompresując od nowa.
Struktura pliku JPEG
Przykładowy nagłówek JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Budowa markera
FF xx:Marker (xx określa typ)LL LL:Długość (2 bajty, big-endian, wliczając samą siebie)Data...:Dane segmentu (długość - 2 bajty)
Pełna lista markerów JPEG
| Marker | Nazwa | Opis |
|---|---|---|
| FF D8 | SOI | Początek obrazu |
| FF D9 | EOI | Koniec obrazu |
| FF C0 | SOF0 | Początek klatki (DCT baseline) |
| FF C2 | SOF2 | Początek klatki (DCT progresywny) |
| FF C4 | DHT | Definicja tablicy Huffmana |
| FF DB | DQT | Definicja tablicy kwantyzacji |
| FF DD | DRI | Definicja interwału restartu |
| FF DA | SOS | Początek skanu (dalej idą dane obrazu) |
| FF FE | COM | Komentarz (metadane) |
| FF E0 | APP0 | Marker JFIF |
| FF E1 | APP1 | Marker EXIF / XMP |
| FF E2 | APP2 | Profil ICC / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Transformacja kolorów Adobe |
Złoty = metadane (usuwane), zwykły = struktura, która zostaje
JFIF kontra EXIF
Oto coś, co myli wiele osób: pliki JPEG często zawierają dwa różne standardy metadanych naraz. JFIF pojawił się pierwszy i zajmuje się podstawami, na przykład rozdzielczością. Potem aparaty zaczęły dopisywać dane EXIF ze wszystkimi szczegółami zdjęcia. Większość dzisiejszych plików JPEG ma jedno i drugie, dlatego zaraz na początku pliku widać markery APP0 i APP1.
APP0:JFIF
JPEG File Interchange Format. Podstawowe informacje o obrazie.
- • Numer wersji
- • Gęstość pikseli (DPI)
- • Proporcje obrazu
- • Opcjonalna miniatura
APP1:EXIF
Exchangeable Image File Format. Metadane z aparatu.
- • Marka i model aparatu
- • Współrzędne GPS
- • Data i godzina
- • Ustawienia ekspozycji
Markery APP w szczegółach
Specyfikacja JPEG zarezerwowała 16 markerów „aplikacyjnych” (od APP0 do APP15), żeby producenci mogli używać ich, jak chcą. Przez lata różne organizacje zajęły różne markery pod własne formaty metadanych. Wyszedł z tego niezły bałagan, ale przynajmniej dobrze udokumentowany.
Trudność polega na tym, że ten sam marker może znaczyć co innego w zależności od zawartości. APP1 może na przykład zawierać dane EXIF albo XMP, więc trzeba zajrzeć do środka i sprawdzić identyfikator, żeby wiedzieć, z czym masz do czynienia.
APP0 (0xFFE0):JFIF
Identyfikator: JFIF\0. Zawiera wersję, jednostki gęstości, gęstość X/Y oraz opcjonalną osadzoną miniaturę. Zwykle można go bezpiecznie zostawić.
APP1 (0xFFE1):EXIF
Identyfikator: Exif\0\0. Zawiera pełną strukturę TIFF z wpisami IFD: dane aparatu, dane GPS, datę i godzinę, miniatury oraz Maker Notes. Główne zagrożenie dla prywatności.
APP1 (0xFFE1):XMP
Identyfikator: http://ns.adobe.com/xap/1.0/\0. Standard metadanych oparty na XML, stworzony przez Adobe. Może zawierać historię edycji, dane o oprogramowaniu i rozszerzone dane EXIF.
Przestrzenie nazw XMP
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):rozszerzone XMP
Identyfikator: http://ns.adobe.com/xmp/extension/\0. Dla danych XMP większych niż 65 KB, podzielonych na kilka segmentów APP1.
APP2 (0xFFE2):MPF
Identyfikator: MPF\0. Multi-Picture Format, dla obrazów stereoskopowych i panoram.
APP2 (0xFFE2):profil ICC
Identyfikator: ICC_PROFILE\0. Dane zarządzania kolorem. Mogą być rozbite na kilka markerów APP2. Zwykle można je bezpiecznie zostawić.
APP13 (0xFFED):IPTC/Photoshop
Identyfikator: Photoshop 3.0\0. Zawiera dane IPTC-IIM: podpisy, słowa kluczowe, prawa autorskie, informacje o twórcy. Może zawierać dane autora.
APP14 (0xFFEE):Adobe
Identyfikator: Adobe\0. Zawiera flagi transformacji kolorów (RGB/CMYK). Ważne dla poprawnego wyświetlania kolorów.
Struktura EXIF
Tu robi się ciekawie (i trochę dziwnie). Dane EXIF to tak naprawdę malutki plik TIFF osadzony w twoim pliku JPEG. Serio. Ma własny nagłówek, własną kolejność bajtów i używa struktury IFD (Image File Directory) z TIFF-a do przechowywania tagów.
Zaraz za identyfikatorem „Exif” znajdziesz nagłówek TIFF, który mówi, czy dane są w porządku little-endian (Intel, „II”), czy big-endian (Motorola, „MM”). Pomyłka na tym etapie sprawia, że wszystkie liczby wychodzą śmieciowe, więc każdy parser sprawdza to jako pierwsze.
Nagłówek TIFF (8 bajtów)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Budowa wpisu IFD (12 bajtów)
Najważniejsze wpisy IFD
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteJak PicScrub przetwarza pliki JPEG
Podejście jest dość proste: przechodzimy przez plik marker po markerze, zostawiamy te, które są niezbędne do wyświetlenia obrazu, i pomijamy te, które zawierają metadane. Ponieważ nigdy nie ruszamy skompresowanych danych obrazu, nie ma żadnej straty jakości.
Kluczem jest to, że oparta na markerach struktura JPEG bardzo to ułatwia. Nie musimy rozumieć współczynników DCT ani tablic Huffmana. Wystarczy, że rozpoznamy, które segmenty są metadanymi, a które nie.
Sprawdzenie nagłówka
Weryfikacja markera SOI (FF D8) na początku pliku
Analiza markerów
Odczyt każdego markera po kolei wraz z jego typem i długością
Rozpoznanie metadanych
Sprawdzenie identyfikatorów w segmentach APP (EXIF, XMP, IPTC i innych)
Wybiórcze kopiowanie
Kopiowanie do wyniku segmentów bez metadanych i pomijanie tych z metadanymi
Co zostaje
- • Markery SOI/EOI (wymagane)
- • DQT (tablice kwantyzacji)
- • SOF (nagłówek klatki)
- • DHT (tablice Huffmana)
- • SOS i dane skanu (sam obraz)
- • Opcjonalnie: profil koloru ICC (do wyboru)
Co usuwamy
- • APP1 EXIF (aparat, GPS, data i godzina)
- • APP1 XMP (metadane edycji)
- • APP13 IPTC (podpisy, autor)
- • Markery COM (komentarze)
- • Miniatury EXIF
Lista tagów EXIF
Nie wszystkie tagi EXIF są tak samo groźne dla prywatności. Niektóre, jak ustawienia ekspozycji, są całkiem nieszkodliwe. Inne, jak numery seryjne czy nazwisko właściciela, mogą jednoznacznie wskazać ciebie albo twój sprzęt. Oto te, które uznajemy za najbardziej ryzykowne:
| ID tagu | Nazwa | Ryzyko dla prywatności |
|---|---|---|
| 0x9003 | DateTimeOriginal | Wysokie |
| 0x9004 | DateTimeDigitized | Wysokie |
| 0x9010 | OffsetTime | Średnie |
| 0x9286 | UserComment | Wysokie |
| 0x927C | MakerNote | Wysokie |
| 0xA420 | ImageUniqueID | Wysokie |
| 0xA430 | CameraOwnerName | Wysokie |
| 0xA431 | BodySerialNumber | Wysokie |
| 0xA434 | LensModel | Średnie |
| 0xA435 | LensSerialNumber | Wysokie |
| 0xFDE8 | OwnerName | Wysokie |
| 0xFDE9 | SerialNumber | Wysokie |
Zobacz wszystkie tagi ustawień aparatu (nieidentyfikujące)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeLista tagów GPS
Dane GPS siedzą we własnym pod-IFD, na który wskazuje tag 0x8825 w głównym IFD. Jeśli ten wskaźnik istnieje, w twoim zdjęciu są dane o lokalizacji. Dzisiejsze telefony są pod tym względem wyjątkowo skrupulatne i zapisują je z dokładnością wystarczającą, żeby wskazać dokładne miejsce, w którym powstało zdjęcie.
| ID tagu | Nazwa | Opis |
|---|---|---|
| 0x0000 | GPSVersionID | Wersja tagów GPS |
| 0x0001 | GPSLatitudeRef | N albo S |
| 0x0002 | GPSLatitude | Stopnie, minuty, sekundy |
| 0x0003 | GPSLongitudeRef | E albo W |
| 0x0004 | GPSLongitude | Stopnie, minuty, sekundy |
| 0x0005 | GPSAltitudeRef | Powyżej albo poniżej poziomu morza |
| 0x0006 | GPSAltitude | Metry |
| 0x0007 | GPSTimeStamp | Godzina UTC |
| 0x001D | GPSDateStamp | Data UTC |
| 0x0012 | GPSMapDatum | Użyty układ odniesienia |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nazwa miejsca |
Lista tagów IPTC
IPTC powstało po to, żeby agencje prasowe mogły zapisywać w zdjęciach podpisy, autorów i informacje o prawach autorskich. Siedzi w APP13, z identyfikatorem „Photoshop 3.0” (tak, Adobe je przejęło). Jeśli kiedykolwiek zdarzyło ci się dodać w Lightroomie albo Photoshopie prawa autorskie czy słowa kluczowe, trafiły właśnie tutaj.
0x0250 By-line (autor)0x0255 By-line Title (funkcja autora)0x025A City (miasto)0x025C Sub-location (dokładne miejsce)0x025F Province/State (region)0x0265 Country Name (kraj)0x0274 Copyright Notice (prawa autorskie)0x0276 Contact (kontakt)0x0237 Date Created (data utworzenia)0x023C Time Created (godzina utworzenia)0x0278 Caption/Abstract (podpis)0x0219 Keywords (słowa kluczowe)