Вы иногда сталкивались с ситуацией, что загруженные на Ваш сайт фотографии с телефона в портретной (вертикальной) ориентации перевёрнуты на 90 градусов? Это объясняется тем, что телефон всегда сохраняет фотографии в альбомной (горизонтально) ориентации и устанавливает метку ориентации в EXIF тегах. Приложение само должно перевернуть фотографию.
Так почему же PHP этого не делает? Неужели он не в состоянии переворачивать фотографии? Всё дело не в PHP, а в программистах, которые данную возможность не учитывают. В данной статье мы научимся правильно обрабатывать фотографии, отснятые на телефон. Для начала нам необходимо прочитать EXIF данные из нашего изображения. Делается это очень просто
$filename = 'filename.jpg'; $exif = exif_read_data($filename);
Теперь попробуем узнать ориентацию изображения, но учитывайте тот факт, что значение Orientation есть не у всех изображений
if( isset( $exif['Orientation'] ) ) { $orientation = $exif['Orientation']; } else { $orientation = NULL; }
Переменная $orientation содержит значение ориентации или NULL, если оно не определено. Теперь остаётся самое простое, это перевернуть изображение. Для этих целей используем функцию imagerotate() из библиотеки GD. Она принимает три параметра: Ресурс изображения, которое необходимо повернуть; угол поворота в градусах против часовой стрелке; цвет фона свободной зоны после поворота. // Открываем изображение $resImage = imagecreatefromjpeg($image); switch( $orientation ) { case 3: // Поворачиваем изображение на 180 градусов, вверх ногами $resImage = imagerotate( $resImage, 180, 0 ); break; case 6: // Поворачиваем изображение на 90 градусов по часовой стрелки $resImage = imagerotate( $resImage, 270, 0 ); break; case 8: // Поворачиваем изображение на 90 градусов против часовой стрелки $resImage = imagerotate( $resImage, 90, 0 ); break; }
После этого наше изображение примет тот вид, которого вы ждали при создании фотографии.
Теперь разберёмся, как переворачивать изображения библиотекой Imagic, это делается с помощью метода rotateImage(). Он принимает два параметра: цвет фона свободной зоны после поворота; угол поворота в градусах по часовой стрелке. В этом заключается отличие, не перепутайте! // Открываем изображение $resImage = new Imagick( $image ); // Выбор ориентации switch( $orientation ) { case 3: // Переворачиваем на 180 градусов по часовой стрелке $resImage->rotateImage( new ImagickPixel(), 180 ); break; case 6: // Поворачиваем изображение на 90 градусов по часовой стрелки $resImage->rotateImage( new ImagickPixel(), 90 ); break; case 8: // Поворачиваем изображение на 90 градусов против часовой стрелки $resImage->rotateImage( new ImagickPixel(), 270 ); break; }
А теперь вы можете свободно использовать ресурс изображения для своих целей. Только не забудьте изменить ширину на высоту!
|