Если я снимаю фотографию с камеры, она сохраняет ориентацию / угол устройства, поэтому, когда я просматриваю изображение на ПК с хорошим приложением, он показывает автоматически повернутое до 0.
Но когда я загружаюсь на сайт, он показывает исходный угол, поэтому изображение выглядит не очень хорошо.
Как я могу обнаружить это с помощью PHP и повернуть изображение, и очистить этот флаг угла от его метаинформации.
Чтобы сделать это, вы должны прочитать информацию 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(); } } }
Если вы просто хотите использовать 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; }
Я изменил пример Криса, чтобы добавить проверку для функции 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 }
Флаг вращения сохраняется как часть данных EXIF (подробнее см. Эту статью ).
Вам нужно будет прочитать флаг вращения из данных EXIF в PHP, а затем повернуть изображение в соответствии с ним. Существует множество библиотек PHP EXIF, если у вас установлен веб-сервер с установленным расширением, вы сможете использовать предоставленную PHP библиотеку .
Я бы предложил поворачивать изображение один раз при загрузке (например, используя библиотеку GD – в наши дни большинство установок PHP, похоже, приходят с ним), так что вам не нужно беспокоиться об очистке данных вращения EXIF (не уверен, насколько это просто с PHP, я никогда не пробовал).