PicScrub logoPicScrub
Повернутися до форматів

JPEG

найбільш балакучий

Файл JPEG зберігає свої метадані в сегментах APPn, між заголовком файлу й даними зображення. Ось що де лежить і що PicScrub робить із кожною частиною.

колірний профіль, лишиться, якщо попросите
SOIпочаток
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMкоментар
SOS …ваше справжнє фото, недоторкане
EOIкінець
тут ховаються GPS і камера, видаляємо
байт у байт те саме

Що видаляється

  • EXIF GPS-координати, виробник і модель камери, дата й час, параметри експозиції
  • XMP історія редагування, використана програма, оцінки
  • IPTC / Photoshop підписи, згадки про авторів, ключові слова
  • Коментарі та вбудовані мініатюри крихітна копія оригіналу, яка може пережити всі ваші кадрування й правки

Що можна залишити

  • Дані зображення завжди недоторкані, ніколи не перекодовуються
  • Колірний профіль ICC за бажанням, щоб кольори лишалися точними
  • Орієнтація за бажанням, щоб вертикальні знімки не лягали набік
  • Згадка про авторські права за бажанням, для фотографів, яким потрібне імʼя без координат

Огляд структури файлу

Якщо ви колись відкривали JPEG у шістнадцятковому редакторі, то помічали, що він складається із сегментів, розділених маркерами. Кожен маркер починається з 0xFF, а далі йде байт, який каже, що це за сегмент. Завдяки такій будові JPEG порівняно легко розбирати: ви просто шукаєте байти FF і дивитеся, що йде після них.

Найцікавіше для приватності те, що всі метадані (EXIF, GPS, дата й час) живуть саме в цих сегментах, окремо від самих даних зображення. Тому ми й можемо видалити метадані, не чіпаючи пікселів і нічого не стискаючи повторно.

Структура файлу JPEG

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 байт
Початок зображення (FF D8)
APP0-15
100 байт
Маркери застосунків (метадані)
DQT
130 байт
Таблиці квантування
SOF
20 байт
Початок кадру
DHT
420 байт
Таблиці Гаффмана
SOS + Data
Змінна довжина
Дані сканування (саме зображення)
EOI
2 байт
Кінець зображення (FF D9)

Приклад заголовка JPEG

SOI (початок зображення)
Маркер APP0
Довжина APP0
Ідентифікатор JFIF
Дані JFIF
Маркер APP1
Довжина APP1
Ідентифікатор Exif
OffsetHexASCII
0000
FFD8FFE000104A464946000101000048
......JFIF.....H
0010
00480000FFE112344578696600000000
.H.....4Exif..

Будова маркера

  • FF xx:маркер (xx визначає тип)
  • LL LL:довжина (2 байти, big-endian, враховує саму себе)
  • Data...:дані сегмента (довжина мінус 2 байти)

Повний довідник маркерів JPEG

МаркерНазваОпис
FF D8SOIПочаток зображення
FF D9EOIКінець зображення
FF C0SOF0Початок кадру (baseline DCT)
FF C2SOF2Початок кадру (progressive DCT)
FF C4DHTОпис таблиці Гаффмана
FF DBDQTОпис таблиці квантування
FF DDDRIОпис інтервалу перезапуску
FF DASOSПочаток сканування (далі йдуть дані зображення)
FF FECOMКоментар (метадані)
FF E0APP0Маркер JFIF
FF E1APP1Маркер EXIF / XMP
FF E2APP2Профіль ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Перетворення кольору Adobe

Золотим позначено метадані (видаляються), звичайним: структуру, яка залишається

JFIF проти EXIF

Ось що збиває з пантелику багатьох: файли JPEG часто містятьдва різні стандарти метаданих одночасно. Спочатку зʼявився JFIF, який відповідає за базові речі на кшталт роздільності. Потім камери почали додавати дані EXIF з усіма подробицями про зйомку. Більшість сучасних JPEG мають і те, і те, тому на початку файлу ви бачите одразу маркери APP0 та APP1.

APP0:JFIF

JPEG File Interchange Format. Базова інформація про зображення.

  • • Номер версії
  • • Щільність пікселів (DPI)
  • • Співвідношення сторін
  • • Необовʼязкова мініатюра

APP1:EXIF

Exchangeable Image File Format. Метадані камери.

  • • Виробник і модель камери
  • • GPS-координати
  • • Дата й час
  • • Параметри експозиції

Маркери APP у деталях

Специфікація JPEG зарезервувала 16 «прикладних» маркерів (від APP0 до APP15), щоб виробники використовували їх як заманеться. З роками різні організації позаймали різні маркери під свої формати метаданих. Вийшов невеликий безлад, але принаймні добре задокументований.

Складність у тому, що той самий маркер може означати різні речі залежно від вмісту. APP1, наприклад, може містити або EXIF, або XMP, тож доводиться дивитися на рядок-ідентифікатор усередині, щоб зрозуміти, з чим ви маєте справу.

APP0 (0xFFE0):JFIF

Ідентифікатор: JFIF\0. Містить версію, одиниці щільності, щільність по X та Y і необовʼязкову вбудовану мініатюру. Зазвичай його можна безпечно зберегти.

APP1 (0xFFE1):EXIF

Ідентифікатор: Exif\0\0. Містить повноцінну структуру TIFF із записами IFD про камеру, дані GPS, дату й час, мініатюри та нотатки виробника. Головна загроза приватності.

APP1 (0xFFE1):XMP

Ідентифікатор: http://ns.adobe.com/xap/1.0/\0. Стандарт метаданих на основі XML від Adobe. Може містити історію редагування, дані про програму та розширені дані EXIF.

Простори імен 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):розширений XMP

Ідентифікатор: http://ns.adobe.com/xmp/extension/\0. Для даних XMP, більших за 65 КБ, які розбиваються на кілька сегментів APP1.

APP2 (0xFFE2):MPF

Ідентифікатор: MPF\0. Multi-Picture Format для стереоскопічних зображень і панорам.

APP2 (0xFFE2):профіль ICC

Ідентифікатор: ICC_PROFILE\0. Дані для керування кольором. Можуть бути розбиті на кілька маркерів APP2. Зазвичай їх безпечно зберігати.

APP13 (0xFFED):IPTC/Photoshop

Ідентифікатор: Photoshop 3.0\0. Містить дані IPTC-IIM: підписи, ключові слова, авторські права, відомості про автора. Може містити інформацію про особу автора.

APP14 (0xFFEE):Adobe

Ідентифікатор: Adobe\0. Містить прапорці перетворення кольору (RGB/CMYK). Важливі для правильного відтворення кольорів.

Структура EXIF

Ось де починається найцікавіше (і трохи дивне). Дані EXIF насправді є крихітним файлом TIFF, вбудованим у ваш JPEG. Так, справді. У нього власний заголовок, власний порядок байтів, а теги він зберігає у структурі IFD (Image File Directory) з TIFF.

Перше, що ви побачите після ідентифікатора «Exif», це заголовок TIFF, який каже, у якому порядку записані дані: little-endian (Intel, «II») чи big-endian (Motorola, «MM»). Помилитеся тут, і всі числа перетворяться на сміття, тож будь-який парсер перевіряє це найпершим.

Заголовок TIFF (8 байтів)

Порядок байтів (II = little-endian)
Магічне число (42)
Зміщення IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

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

Будова запису IFD (12 байтів)

Tag IDTypeCountValue/Offset
2 байти2 байти4 байти4 байти

Ключові записи IFD

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

Як PicScrub обробляє JPEG

Підхід доволі простий: ми читаємо файл маркер за маркером, залишаємо ті, що потрібні для показу зображення, і пропускаємо ті, що містять метадані. Оскільки стиснених даних зображення ми не торкаємося взагалі, втрат якості немає жодних.

Ключ до всього: побудова JPEG на маркерах, яка дуже це спрощує. Нам не потрібно розбиратися ні в коефіцієнтах DCT, ні в таблицях Гаффмана. Досить визначити, які сегменти є метаданими, а які ні.

1

Перевіряємо заголовок

Переконуємося, що на початку файлу є маркер SOI (FF D8)

2

Розбираємо маркери

Читаємо кожен маркер послідовно, визначаючи тип і довжину

3

Знаходимо метадані

Перевіряємо ідентифікатори в сегментах APP (EXIF, XMP, IPTC тощо)

4

Копіюємо вибірково

Переносимо у вихідний файл усе, крім метаданих, а сегменти з метаданими пропускаємо

Що зберігається

  • • маркери SOI/EOI (обовʼязкові)
  • • DQT (таблиці квантування)
  • • SOF (заголовок кадру)
  • • DHT (таблиці Гаффмана)
  • • SOS і дані сканування (саме зображення)
  • • за бажанням: колірний профіль ICC (налаштовується)

Що видаляється

  • • APP1 EXIF (камера, GPS, дата й час)
  • • APP1 XMP (метадані редагування)
  • • APP13 IPTC (підписи, автор)
  • • маркери COM (коментарі)
  • • мініатюри з EXIF

Довідник тегів EXIF

Не всі теги EXIF однаково небезпечні для приватності. Одні, як-от параметри експозиції, цілком безневинні. Інші, як-от серійні номери та імена власників, можуть однозначно вказати на вас чи вашу техніку. Ось ті, які ми вважаємо найризикованішими:

Tag IDНазваРизик для приватності
0x9003DateTimeOriginalВисокий
0x9004DateTimeDigitizedВисокий
0x9010OffsetTimeСередній
0x9286UserCommentВисокий
0x927CMakerNoteВисокий
0xA420ImageUniqueIDВисокий
0xA430CameraOwnerNameВисокий
0xA431BodySerialNumberВисокий
0xA434LensModelСередній
0xA435LensSerialNumberВисокий
0xFDE8OwnerNameВисокий
0xFDE9SerialNumberВисокий
Показати всі теги з параметрами зйомки (не ідентифікують вас)
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

Довідник тегів GPS

Дані GPS живуть в окремому під-IFD, на який вказує тег 0x8825 у головному IFD. Якщо цей вказівник є, у вашому зображенні є дані про місцеперебування. Сучасні смартфони особливо старанно їх вбудовують, часто з такою точністю, що можна визначити, де саме ви стояли.

Tag IDНазваОпис
0x0000GPSVersionIDВерсія тегів GPS
0x0001GPSLatitudeRefN або S
0x0002GPSLatitudeГрадуси, мінути, секунди
0x0003GPSLongitudeRefE або W
0x0004GPSLongitudeГрадуси, мінути, секунди
0x0005GPSAltitudeRefВище або нижче рівня моря
0x0006GPSAltitudeМетри
0x0007GPSTimeStampЧас UTC
0x001DGPSDateStampДата UTC
0x0012GPSMapDatumГеодезична система координат
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationНазва місця

Довідник тегів IPTC

IPTC придумали для інформагенцій, щоб вбудовувати в знімки підписи, згадки про авторів і відомості про авторські права. Він зберігається всередині APP13 з ідентифікатором «Photoshop 3.0» (так, Adobe перейняла цей стандарт). Якщо ви колись додавали копірайт чи ключові слова в Lightroom або Photoshop, вони опинилися саме тут.

0x0250 By-line (автор)
0x0255 By-line Title (посада автора)
0x025A City (місто)
0x025C Sub-location (місцевість)
0x025F Province/State (область)
0x0265 Country Name (країна)
0x0274 Copyright Notice (авторські права)
0x0276 Contact (контакти)
0x0237 Date Created (дата створення)
0x023C Time Created (час створення)
0x0278 Caption/Abstract (підпис)
0x0219 Keywords (ключові слова)