Автор столкнулся с бытовой задачей: накладывал маску на изображение, и у маски не было Exif-метаданных, а у самого снимка — были. Пришлось разбираться, как читать ориентацию из Exif. Так появился этот гайд.
Exif (Exchangeable Image File Format) — это формат метаданных, который пришёл из мира цифровых камер в 1995 году. Нужен он был, чтобы в JPEG-файл можно было записать выдержку, диафрагму, дату и то, что камера была повёрнута. Современный стандарт поддерживает CIPA. Exif — необязательная штука: в одном снимке его полно, в другом нет, а в третьем — фейковые данные.
Внутри JPEG-файла Exif лежит в маркерном сегменте APP1 (с сигнатуры FF E1). Сразу за ней идёт строка Exif\0\0, а после — фактически TIFF-структура: байтовый порядок (II для little-endian или MM для big-endian), магическое число 42, и цепочка IFD (Image File Directory). В IFD0, среди прочих тегов, живёт 0x0112 — тот самый тег ориентации. Его значение — целое число от 1 до 8.
Самое смешное и неудобное: камеры и телефоны не поворачивают матрицу пикселей. Они сохраняют картинку как есть, а в тег Orientation пишут, как её показывать. Значение 1 — норма, 3 — поворот на 180°, 6 — поворот на 90° по часовой, 8 — на 90° против. Есть ещё зеркальные отражения.
Если вы разработчик и работаете с пикселями, проще всего нормализовать ориентацию до обработки: применить трансформацию и сбросить тег на 1. Иначе какой-нибудь вьювер потом довернёт картинку ещё раз. В Python + PIL это делает ImageOps.exif_transpose(img), в Sharp для JS — .rotate() без аргумента.
Exif — это не всё. Есть ещё XMP (разметка от Adobe), IPTC (для журналистов: подписи, копирайты), ICC-профили (цвет), C2PA (цифровые подписи происхождения). В PNG свои чанки, в HEIC — свои боксы. «Стереть Exif» не равно «стереть все метаданные». И не надейтесь, что ОС сама почистит данные при загрузке — проверяйте явно.
Лучший инструмент для работы с метаданными — exiftool. Это Perl-скрипт, который знает все странности реальных файлов. С его помощью можно смотреть, менять и чистить теги. Например, exiftool -all= image.jpg удалит всю метаданные, а exiftool -Orientation image.jpg покажет ориентацию человеческим текстом. Хотите подшутить — запишите в поле Artist маленького гоблина или поставьте GPS-координаты на картинку с котиком. Метаданные — это просто данные, которым не надо верить на слово.