Как определить угол съемки фотографии и автоматический поворот для отображения веб-сайта, например, на настольных приложениях?
Если я снимаю фотографию с камеры, она сохраняет ориентацию/угол устройства, поэтому, когда я просматриваю изображение на ПК с хорошим приложением, он показывает, что он автоматически поворачивается на 0.
Но когда я загружаюсь на сайт, он показывает исходный угол, поэтому изображение выглядит не очень хорошо.
Как я могу обнаружить это с помощью PHP и повернуть изображение, и очистить этот флаг угла от него метаинформацией.
Ответы
Ответ 1
Чтобы сделать это, вы должны прочитать информацию EXIF из файла JPEG. Вы можете сделать это с помощью exif
Расширение PHP или PEL
.
В принципе, вы должны прочитать флаг Orientation
в файле. Ниже приведен пример использования exif
расширения PHP и WideImage
для обработки изображений.
<?php
$exif = exif_read_data($filename);
$ort = $exif['Orientation'];
$image = WideImage::load($filename);
// GD doesn't support EXIF, so all information is removed.
$image->exifOrient($ort)->saveToFile($filename);
class WideImage_Operation_ExifOrient
{
/**
* Rotates and mirrors and image properly based on current orientation value
*
* @param WideImage_Image $img
* @param int $orientation
* @return WideImage_Image
*/
function execute($img, $orientation)
{
switch ($orientation) {
case 2:
return $img->mirror();
break;
case 3:
return $img->rotate(180);
break;
case 4:
return $img->rotate(180)->mirror();
break;
case 5:
return $img->rotate(90)->mirror();
break;
case 6:
return $img->rotate(90);
break;
case 7:
return $img->rotate(-90)->mirror();
break;
case 8:
return $img->rotate(-90);
break;
default: return $img->copy();
}
}
}
Ответ 2
Если вы просто хотите использовать GD и расширение php EXIF, вы можете использовать это:
function _mirrorImage ( $imgsrc)
{
$width = imagesx ( $imgsrc );
$height = imagesy ( $imgsrc );
$src_x = $width -1;
$src_y = 0;
$src_width = -$width;
$src_height = $height;
$imgdest = imagecreatetruecolor ( $width, $height );
if ( imagecopyresampled ( $imgdest, $imgsrc, 0, 0, $src_x, $src_y, $width, $height, $src_width, $src_height ) )
{
return $imgdest;
}
return $imgsrc;
}
function adjustPicOrientation($full_filename){
$exif = exif_read_data($full_filename);
if($exif && isset($exif['Orientation'])) {
$orientation = $exif['Orientation'];
if($orientation != 1){
$img = imagecreatefromjpeg($full_filename);
$mirror = false;
$deg = 0;
switch ($orientation) {
case 2:
$mirror = true;
break;
case 3:
$deg = 180;
break;
case 4:
$deg = 180;
$mirror = true;
break;
case 5:
$deg = 270;
$mirror = true;
break;
case 6:
$deg = 270;
break;
case 7:
$deg = 90;
$mirror = true;
break;
case 8:
$deg = 90;
break;
}
if ($deg) $img = imagerotate($img, $deg, 0);
if ($mirror) $img = _mirrorImage($img);
$full_filename = str_replace('.jpg', "-O$orientation.jpg", $full_filename);
imagejpeg($img, $full_filename, 95);
}
}
return $full_filename;
}
Ответ 3
Я модифицировал пример Криса, чтобы добавить проверку для функции exif, удалить зеркалирование, а также записать файл обратно в файловую систему с использованием того же имени файла. Таким образом, вы можете вызвать эту функцию сразу после вызова move_uploaded_file, например:
move_uploaded_file($uploadedFile, $destinationFilename);
correctImageOrientation($destinationFilename);
function correctImageOrientation($filename) {
if (function_exists('exif_read_data')) {
$exif = exif_read_data($filename);
if($exif && isset($exif['Orientation'])) {
$orientation = $exif['Orientation'];
if($orientation != 1){
$img = imagecreatefromjpeg($filename);
$deg = 0;
switch ($orientation) {
case 3:
$deg = 180;
break;
case 6:
$deg = 270;
break;
case 8:
$deg = 90;
break;
}
if ($deg) {
$img = imagerotate($img, $deg, 0);
}
// then rewrite the rotated image back to the disk as $filename
imagejpeg($img, $filename, 95);
} // if there is some rotation necessary
} // if have the exif orientation info
} // if function exists
}
Ответ 4
Флаг вращения сохраняется как часть данных EXIF (см. в этой статье для получения дополнительной информации).
Вам нужно будет прочитать флаг вращения из данных EXIF в PHP и затем повернуть изображение в соответствии с ним. Существует множество библиотек PHP EXIF, если у вас установлен веб-сервер с установленным расширением, вы можете использовать предоставленную PHP библиотеку.
Я бы предложил повернуть изображение один раз при загрузке (например, используя GD-библиотеку - большинство установок PHP в эти дни, похоже, приходят с ней), так что вам не нужно беспокоиться об очистке данных вращения EXIF (не уверен, насколько это просто с PHP, я никогда не пробовал).