При сжатии фото оно поворачивается 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);
}