Intereting Posts
Дата PHP () показывает дату завтрашнего дня Как выполнить регулярное выражение URL для структуры маршрутизации? Codeigniter Запустить несколько приложений Как запрограммировать систему голосования? Использование __get () (магия) для эмуляции корректности для чтения и ленивой загрузки Чтение поля mysql php, возвращающее странный символ Отображение в таблице, если поиск совпадает с php Предупреждение: mysql_fetch_assoc () ожидает, что параметр 1 будет ресурсом, объект указан Разбор PHP-ответа: Неактивный SyntaxError: Неожиданный токен < Как управлять ролями пользователей в базе данных? Разделить запятую значение из столбца таблицы в строки с помощью mysql? OAuth – ошибка в Twitter (не удалось аутентифицировать) PHP: RegEx для строки с 3-9 буквами и 5-50 числами PHP-скрипт не может читать xml-данные с помощью двоеточия (:) Выбросить исключение в функции или как выполнить обработку ошибок спуска

Как определить угол съемки фотографии и автоматический поворот для отображения веб-сайта, например, на настольных приложениях?

Если я снимаю фотографию с камеры, она сохраняет ориентацию / угол устройства, поэтому, когда я просматриваю изображение на ПК с хорошим приложением, он показывает автоматически повернутое до 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, я никогда не пробовал).