При сжатии фото оно поворачивается php

Есть такой код для сжатия изображения:

if (in_array($file_mime, ['image/jpeg', 'image/png'])) {
    switch ($file_mime) {
        case 'image/jpeg':
            $image = imagecreatefromjpeg($target_directory . '/' . $filename);
            break;
        case 'image/png':
            $image = imagecreatefrompng($target_directory . '/' . $filename);
            break;
    }
    imagejpeg($image, $target_directory . '/' . $filename, 60);
}

С небольшим размером фото все отлично, но если размер больше пары мб (не замерял точный лимит), то фото сжимается и поворачивается на 90 градусов. В чем может быть проблема и как пофиксить?

UPD: возможно это из-за ориентации: в метаданных фото, которые нормально сжались ничего не написано про ориентацию, а в перевернутых фото написано про поворот на 90 градусов. Однако в самом проводнике эти фото выглядят нормально до сжатия, после сжатия переворачиваются и в проводнике.


Ответы (1 шт):

Автор решения: Андрей Якута

Была проблема в ориентации, а именно функция imagecreatefromjpeg игнорируют тег ориентации. Этот код решает проблему:

if (in_array($file_mime, ['image/jpeg', 'image/png'])) {
    switch ($file_mime) {
        case 'image/jpeg':
            $image = imagecreatefromjpeg($target_directory . '/' . $filename);
            $exif = exif_read_data($target_directory . '/' . $filename);
            if ($image && $exif && isset($exif['Orientation'])) {
                $ort = $exif['Orientation'];

                if ($ort == 6 || $ort == 5) {
                    $image = imagerotate($image, 270, 0);
                }
                if ($ort == 3 || $ort == 4) {
                    $image = imagerotate($image, 180, 0);
                }
                if ($ort == 8 || $ort == 7) {
                    $image = imagerotate($image, 90, 0);
                }

                if ($ort == 5 || $ort == 4 || $ort == 7) {
                    imageflip($image, IMG_FLIP_HORIZONTAL);
                }
            }
            break;
        case 'image/png':
            $image = imagecreatefrompng($target_directory . '/' . $filename);
            break;
    }
    imagejpeg($image, $target_directory . '/' . $filename, 60);
}
→ Ссылка