При обработке переворачивается изображения php
Подскажите, в чём тут ошибка? В коде не выполняется всё что после if (!empty($exif['Orientation'])) { .... }
$file_name = $filetodb;
$maxDim = 2000;
$quality = 85;
list($width, $height, $type, $attr) = getimagesize( $file_name );
if ( $width > $maxDim || $height > $maxDim ) {
$ratio = $width/$height;
if( $ratio > 1) {
$new_width = $maxDim;
$new_height = $maxDim/$ratio;
} else {
$new_width = $maxDim*$ratio;
$new_height = $maxDim;
}
//вращаем изображение
$exif = exif_read_data($file_name);
//var_dump($exif);
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 3:
$file_name= imagerotate($file_name, 180, 0);
break;
case 6:
$file_name = imagerotate($file_name, 90, 0);
break;
case 8:
$file_name= imagerotate($file_name, -90, 0);
break;
}
}
$src = imagecreatefromstring( file_get_contents( $file_name ) );
$dst = imagecreatetruecolor( $new_width, $new_height );
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
imagejpeg($dst,$file_name,$quality);
imagedestroy( $src );
imagedestroy( $dst );
Ответы (1 шт):
Фотография при загрузке заливается как есть. Горизонтально. Оттого, что ты повернул фотоаппарат, положение матрицы относительно объектива как бы не меняется. То есть, для фотоаппарата все фотографии - горизонтальные. Как на фотопленке: как бы ты ни вертел аппарат, на пленке все фотографии параллельны друг другу. Точно так же сохраняются и файлы в телефоне.
Другое дело, что фотоаппарат может запомнить, как его вертели, и записать текущее положение в метаданные файла с изображением. А практически все современные программы умеют эту информацю читать, и автоматически поворачивать фотографию. Поэтому у незадачливого зрителя складывается впечатление, что фотографии "заливаются уже повернутыми".
Так что теперь и нашему РНР программисту остается обучить свою программу этой нехитрой премудрости. Я предполагаю, что после заливки фотографии как-то обрабатываются. Вот к этой обработке и надо добавить поворот. Для GD это будет функция imagerotate(), а информацию об исходной ориентации можно получить с помощью функции getImageOrientation(). Если она недоступна - то exif_read_data() или с помощью каких либо ещё библиотек.