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