Що насправді міститься всередині фотографії

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

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

Інструмент вище зчитує цей блок і показує його вам, перш ніж щось видалити, тому що аргументом є цифри. «Це фото містить метадані EXIF» — це абстрактно. Пара координат, які вказують на ваші вхідні двері — ні.

Видаляйте байти, не перекодовуйте

Існує два способи видалити метадані із зображення, і лише один із них правильний.

Легкий спосіб — намалювати картинку на HTML-canvas і зберегти її знову. Метадані зникають, тому що canvas ніколи їх не мав. Він також стискає картинку знову — другий етап стиснення JPEG з втратами поверх стиснення камери — і видаляє вбудований колірний профіль, тому «очищений» файл відчутно гірший за оригінал, а його кольори змінилися. Більшість безкоштовних інструментів для видалення метаданих працюють таким чином, і саме тому файл, який ви отримуєте назад, часто має інший розмір і є трохи іншою картинкою.

Цей інструмент робить інше. JPEG — це послідовність маркерних сегментів; PNG — це послідовність частин (chunks); WebP — це контейнер RIFF. Метадані знаходяться у специфічних, ідентифікованих сегментах у кожному — блоках APPn у JPEG, частинах eXIf, tEXt, iTXt, zTXt і tIME у PNG, частинах EXIF та XMP у WebP. Їх видалення — це питання проходження по власній структурі файлу, пропуску цих блоків і копіювання всього іншого без змін.

Стиснута картинка ніколи не декодується. Це означає, що дані зображення у файлі, який ви завантажуєте, є біт-в-біт даними зображення у файлі, який ви надали — не «візуально ідентичні», не «високої якості», а ідентичні. Єдина відмінність між двома файлами полягає в метаданих, які були видалені.

Що ми не видаляємо і чому

Дві речі свідомо зберігаються, і обидві показуються вам з прапорцем на випадок, якщо ви не згодні.

Колірний профіль. Профіль ICC описує, в якому колірному просторі закодовані пікселі. Сучасні телефони знімають у широкій гамі, і фотографія з широкою гамою без профілю інтерпретується як звичайний sRGB і відображається неправильно — зазвичай блякло, іноді яскраво і неприродно. Профіль описує зображення, а не фотографа, тому за замовчуванням він залишається.

Прапорець обертання, коли фотографії він потрібен. Телефони не обертають пікселі, коли ви повертаєте камеру; вони зберігають фотографію такою, як її побачив датчик, і записують один номер EXIF, який вказує, якою стороною догори він має бути. Видаліть це число, і чиста копія вийде перевернутою в будь-якому додатку, який його поважає. Коли фотографія покладається на нього, цей інструмент відновлює мінімальний блок, що містить це єдине значення і нічого іншого — жодної камери, жодної мітки часу, жодного місцезнаходження.

Де це залишає ваші інші фотографії

Очищення файлу перед його надсиланням вирішує половину проблеми з обміном. Воно нічого не робить для фотографій, які все ще лежать у вашій галереї, які зберігають кожне поле, що цей інструмент щойно видалив, і які можуть бути прочитані будь-чим, що має доступ до пристрою.

Саме для цієї половини існує Vaultine: зашифрований сейф, де файли блокуються за допомогою AES-256-GCM на самому пристрої, відкриваються у вбудованому переглядачі, а не розшифровуються на диск, і розблоковуються малюнком або PIN-кодом, а не акаунтом. Це інше завдання порівняно з цією сторінкою — Vaultine зберігає файли, він не редагує їхні метадані — але це дві половини одного й того ж інстинкту. Фотографії, якими ви ділитеся, видають те, де ви були. Фотографії, які ви зберігаєте, мають бути заблоковані.