Jeśli tylko chcesz używać GD i rozszerzenie php EXIF można użyć to:
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;
}
nie był pewien, jak użyć klasy Andrew pisał, więc po prostu umieścić funkcję w moim kontrolera i przekazywane zmienna obrazu i orientacja do niego. Praca jest jak mistrz. Jedynym komentarzem jest sprawdzenie, czy obraz jest typu JPEG przed wywołaniem exif_read_data, w przeciwnym razie php zgłosi błąd. – w00tw00t111
Pamiętaj, że ten kod wymaga zainstalowania biblioteki PHP WideImage. (Andrew o tym wspomina, ale wiem, że większość ludzi po prostu skopiuje i wklei kod, a potem nie zrozumie, dlaczego nie działa dla nich.) Jeśli nie chcesz instalować WideImage, istnieją inne przykłady tego, jak rób to bez niego. – orrd
@ w00tw00t111 to typ pliku innego niż JPEG, który powoduje następujący błąd? 'Błąd krytyczny: brak wyjątku" WideImage_UnknownImageOperationException "z komunikatem" Nie można załadować "operacji exifOrient." " –