DANFA

PHP: Как определить поворот изображения с помощью exif_read_data()

Что такое EXIF и зачем он нужен


EXIF (Exchangeable Image File Format) — это стандарт, позволяющий добавлять к изображениям и другим файлам метаданные: информацию о камере, настройках съёмки, дате, геолокации и ориентации снимка.

Эти данные записываются камерой или смартфоном при создании фото и могут быть прочитаны специальными инструментами, в том числе PHP‑функцией exif_read_data().

Как EXIF хранит информацию о повороте


Ключевой параметр для определения поворота — поле Orientation (ориентация). Оно принимает значения от 1 до 8, каждое из которых описывает определённое положение камеры при съёмке:
  • 1: нормальное положение (0°);
  • 3: повёрнуто на 180°;
  • 6: повёрнуто на 90° по часовой стрелке;
  • 8: повёрнуто на 90° против часовой стрелки.

Остальные значения (2, 4, 5, 7) описывают зеркальные повороты, которые встречаются реже.

Практический пример на PHP
Шаг 1. Чтение EXIF‑данных
Используйте функцию exif_read_data(), чтобы получить метаданные изображения:
$exifData = exif_read_data('path/to/your/image.jpg');

Шаг 2. Проверка наличия поля Orientation
Убедитесь, что поле Orientation присутствует:
if (isset($exifData['Orientation'])) {
    $orientation = $exifData['Orientation'];
    echo "Ориентация: $orientation";
} else {
    echo "Поле Orientation не найдено.";
}

Шаг 3. Анализ значения Orientation
Сравните значение с известными кодами:
switch ($orientation) {
    case 1:
        echo "Изображение не повернуто.";
        break;
    case 3:
        echo "Повернуто на 180°.";
        break;
    case 6:
        echo "Повернуто на 90° по часовой стрелке.";
        break;
    case 8:
        echo "Повернуто на 90° против часовой стрелки.";
        break;
    default:
        echo "Нестандартная ориентация (код $orientation).";
}

Полный рабочий скрипт


<?php
$imagePath = 'path/to/your/image.jpg';

// Читаем EXIF-данные
$exifData = exif_read_data($imagePath);

if (!$exifData) {
    die("Не удалось прочитать EXIF-данные.");
}

// Проверяем ориентацию
if (isset($exifData['Orientation'])) {
    $orientation = $exifData['Orientation'];
    
    switch ($orientation) {
        case 1:
            echo "Изображение в исходной ориентации (0°).";
            break;
        case 3:
            echo "Повернуто на 180°.";
            break;
        case 6:
            echo "Повернуто на 90° по часовой стрелке.";
            break;
        case 8:
            echo "Повернуто на 90° против часовой стрелки.";
            break;
        default:
            echo "Нестандартная ориентация: код $orientation.";
    }
} else {
    echo "Информация об ориентации отсутствует.";
}
?>

Важные нюансы


  1. Не все изображения содержат EXIF. Например, скриншоты или картинки, обработанные в редакторах, могут потерять метаданные.
  2. Некоторые программы автоматически корректируют поворот. Если изображение уже «выправлено» в редакторе, поле Orientation может быть сброшено до 1.
  3. Формат файла. EXIF поддерживается в JPEG, TIFF и некоторых других форматах, но отсутствует в PNG и WebP.

Альтернативные методы


Если EXIF недоступен, можно попробовать:
  • Анализ размеров. Сравните ширину и высоту: если высота > ширины, вероятно, снимок был сделан в портретном режиме.
  • Использование библиотек. Например, Imagick или GD в PHP позволяют программно определять и корректировать ориентацию.

Заключение


Функция exif_read_data() — простой и надёжный способ узнать, был ли повёрнут снимок. Главное — проверять наличие поля Orientation и корректно интерпретировать его значения. Это особенно полезно при разработке фотогалерей, систем загрузки изображений или инструментов для обработки снимков.

Автор:  Вчера, 6:49 pm