Это происходит потому, что изображения были получены с помощью мобильного устройства, которое имеет встроенные данные об ориентации EXIF (см. этот превосходный пост об ориентации EXIF для получения более подробной информации).
Изображение автоматически поворачивается на 270 градусов по часовой стрелке, но когда я открываю изображение в новом окне, оно отображается правильно.
На самом деле происходит обратное: изображение не поворачивается, оно отображается точно в том виде, в котором оно было сохранено. Открывая изображение в новом окне браузера или другой программе для работы с изображениями, оно автоматически поворачивается в соответствии со значением ориентации EXIF, чтобы отображаться так, как вы ожидаете.
GD показывает изображение «правильно» в том смысле, что оно не изменяет изображение каким-либо иным образом, кроме как вы его указали.
Чтобы отобразить изображение так, как вы считаете правильным, вам нужно использовать следующий код (из этот ответ ), который зависит от exif extension , являющегося включено в вашем php.ini :
$filepath = ''; // path to the image you want to manipulate.
$image = ''; // using imagecreatefrom...
// Rotate image correctly!
$exif = exif_read_data($filepath);
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 1: // nothing
break;
case 2: // horizontal flip
imageflip($image, IMG_FLIP_HORIZONTAL);
break;
case 3: // 180 rotate left
$image = imagerotate($image, 180, 0);
break;
case 4: // vertical flip
imageflip($image, IMG_FLIP_VERTICAL);
break;
case 5: // vertical flip + 90 rotate right
imageflip($image, IMG_FLIP_VERTICAL);
$image = imagerotate($image, -90, 0);
break;
case 6: // 90 rotate right
$image = imagerotate($image, -90, 0);
break;
case 7: // horizontal flip + 90 rotate right
imageflip($image, IMG_FLIP_HORIZONTAL);
$image = imagerotate($image, -90, 0);
break;
case 8: // 90 rotate left
$image = imagerotate($image, 90, 0);
break;
}
}