PicScrub logoPicScrub
Wróć do formatów

JPEG

ten przecieka najbardziej

Plik 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ą.

profil koloru, zostaje, jeśli chcesz
SOIpoczątek
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMkomentarz
SOS …twoje prawdziwe zdjęcie, nietknięte
EOIkoniec
tu chowa się GPS i aparat, usuwane
identyczne bajt w bajt

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

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 B
Początek obrazu (FF D8)
APP0-15
100 B
Markery aplikacji (metadane)
DQT
130 B
Tablice kwantyzacji
SOF
20 B
Początek klatki
DHT
420 B
Tablice Huffmana
SOS + Data
Zmienna długość
Dane skanu (obraz)
EOI
2 B
Koniec obrazu (FF D9)

Przykładowy nagłówek JPEG

SOI (początek obrazu)
Marker APP0
Długość APP0
Identyfikator JFIF
Dane JFIF
Marker APP1
Długość APP1
Identyfikator Exif
OffsetHexASCII
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

MarkerNazwaOpis
FF D8SOIPoczątek obrazu
FF D9EOIKoniec obrazu
FF C0SOF0Początek klatki (DCT baseline)
FF C2SOF2Początek klatki (DCT progresywny)
FF C4DHTDefinicja tablicy Huffmana
FF DBDQTDefinicja tablicy kwantyzacji
FF DDDRIDefinicja interwału restartu
FF DASOSPoczątek skanu (dalej idą dane obrazu)
FF FECOMKomentarz (metadane)
FF E0APP0Marker JFIF
FF E1APP1Marker EXIF / XMP
FF E2APP2Profil ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Transformacja 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)

Kolejność bajtów (II = little-endian)
Liczba magiczna (42)
Offset IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

II = Intel (little-endian), MM = Motorola (big-endian)

Budowa wpisu IFD (12 bajtów)

ID taguTypLiczbaWartość/offset
2 bajty2 bajty4 bajty4 bajty

Najważniejsze wpisy IFD

0x010F:Make
0x0110:Model
0x0132:DateTime
0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0x927C:MakerNote

Jak 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.

1

Sprawdzenie nagłówka

Weryfikacja markera SOI (FF D8) na początku pliku

2

Analiza markerów

Odczyt każdego markera po kolei wraz z jego typem i długością

3

Rozpoznanie metadanych

Sprawdzenie identyfikatorów w segmentach APP (EXIF, XMP, IPTC i innych)

4

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 taguNazwaRyzyko dla prywatności
0x9003DateTimeOriginalWysokie
0x9004DateTimeDigitizedWysokie
0x9010OffsetTimeŚrednie
0x9286UserCommentWysokie
0x927CMakerNoteWysokie
0xA420ImageUniqueIDWysokie
0xA430CameraOwnerNameWysokie
0xA431BodySerialNumberWysokie
0xA434LensModelŚrednie
0xA435LensSerialNumberWysokie
0xFDE8OwnerNameWysokie
0xFDE9SerialNumberWysokie
Zobacz wszystkie tagi ustawień aparatu (nieidentyfikujące)
0x829A ExposureTime
0x829D FNumber
0x8822 ExposureProgram
0x8827 ISOSpeedRatings
0x9201 ShutterSpeedValue
0x9202 ApertureValue
0x9203 BrightnessValue
0x9204 ExposureBiasValue
0x9207 MeteringMode
0x9208 LightSource
0x9209 Flash
0x920A FocalLength
0xA001 ColorSpace
0xA002 PixelXDimension
0xA003 PixelYDimension
0xA402 ExposureMode
0xA403 WhiteBalance
0xA405 FocalLengthIn35mmFilm
0xA406 SceneCaptureType

Lista 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 taguNazwaOpis
0x0000GPSVersionIDWersja tagów GPS
0x0001GPSLatitudeRefN albo S
0x0002GPSLatitudeStopnie, minuty, sekundy
0x0003GPSLongitudeRefE albo W
0x0004GPSLongitudeStopnie, minuty, sekundy
0x0005GPSAltitudeRefPowyżej albo poniżej poziomu morza
0x0006GPSAltitudeMetry
0x0007GPSTimeStampGodzina UTC
0x001DGPSDateStampData UTC
0x0012GPSMapDatumUżyty układ odniesienia
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationNazwa 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)