Что такое EXIF
EXIF — служебный блок внутри файла снимка: модель камеры или телефона, выдержка, диафрагма, дата съёмки, иногда координаты места. Почти все эти поля никак не влияют на изображение, кроме одного — ориентации. Камера часто пишет пиксели так, как их снял сенсор, и добавляет тег «поверни на четверть». Программа, которая тег игнорирует, показывает снимок лежащим на боку.
Обновлено:
Коротко о цифрах
- Значения тега
- 1–8; значения 5–8 разворачивают кадр на четверть и меняют стороны местами
- Пробник
- JPEG 2×1 с тегом ориентации 6: декодер, вернувший 1×2, применил тег
- Ручное чтение
- тег ищется в первых 256 КБ файла
- После обработки
- из холста EXIF не переносится; исходник, возвращённый сжатием: JPEG — без EXIF, WebP — как был
- PNG
- тега ориентации не имеет
Тег ориентации и восемь его значений
- 1 — снимок хранится как есть, поворачивать не нужно.
- 3 — разворот на сто восемьдесят градусов: телефон снимали «вверх ногами».
- 6 и 8 — четверть оборота в одну и другую сторону, самый частый случай для вертикальных фото.
- Значения от 5 до 8 меняют стороны местами: снимок 4000 на 3000 после разворота становится 3000 на 4000, и это надо учитывать до создания холста.
- Остальные значения описывают зеркальные отражения и встречаются редко.
Почему мы проверяем поведение декодера, а не наличие возможности
Очевидный подход — спросить у браузера, умеет ли он применять тег, — не работает. Один известный браузер два выпуска подряд принимал соответствующую настройку и молча возвращал неповёрнутые пиксели. Проверка «есть ли такая возможность» ложна в обе стороны: возможность может быть заявлена и не работать, а работать она может и без заявления.
Поэтому проверяется эффект. В коде зашит крошечный снимок два на один пиксель с тегом ориентации 6. Он декодируется один раз при первом обращении: если браузер вернул его как один на два, значит тег применён, и ему можно доверять всю остальную работу. Если вернул как есть — мы читаем тег из файла сами, сканируя начало файла, и разворачиваем холст вручную.
Что происходит с EXIF после обработки
- Результат кодируется из холста, а холст никаких служебных блоков не хранит — координаты, модель камеры и дата съёмки в выходной файл не переносятся. Если перекодирование не сделало бы файл легче, сжатие возвращает исходник: JPEG — с теми же пикселями, но без EXIF, XMP и IPTC, а WebP — как был, со всеми метаданными.
- Побочный эффект приятный: снимок после обрезки или смены формата, а JPEG — и после сжатия, не несёт с собой места съёмки.
- В перекодированном файле ориентация сохраняется правильной, потому что она применена к самим пикселям, а не оставлена тегом.
- Сборка PDF из фотографий тоже учитывает тег, но по-другому: он читается до того, как EXIF вырезается, поворот делает матрица на странице, а данные снимка ложатся в документ байт в байт.
- В PNG понятия EXIF-ориентации нет вовсе, поэтому и проблемы с разворотом у него не возникает.
Частые вопросы
Почему фото на телефоне ровное, а на компьютере лежит на боку?
Телефон применяет тег ориентации при показе, а программа на компьютере может его игнорировать и рисовать пиксели как есть. Само изображение при этом одинаковое — разница только в том, читают тег или нет.
Удаляет ли ваш сжиматель геометки?
У JPEG — всегда, если файл не повреждён: пережатый результат собирается из холста, а из исходника, который возвращается, когда пережатие не сделало бы файл легче, вырезаются EXIF, XMP и IPTC — пиксели те же, координат нет. WebP в таком случае возвращается как был, со своими метаданными. Обрезка и перевод формата кодируют заново всегда, так что после них геометки нет ни у одного формата.
Можно ли повернуть фото, не трогая пиксели?
Можно, если менять только тег ориентации — так делают некоторые просмотрщики. Но тогда результат снова зависит от того, читает ли этот тег программа получателя, и снимок может опять лечь на бок.
Есть ли EXIF в PNG и в PDF?
У PNG понятия EXIF-ориентации нет. В PDF служебные сведения хранятся своим способом — в свойствах документа и в XMP-пакете. Снимки, которые мы кладём в PDF, EXIF не несут: у JPEG блоки EXIF, XMP и IPTC вырезаются, а данные изображения остаются байт в байт. Как есть вкладывается лишь повреждённый JPEG, который не удаётся разобрать по блокам.