Detecte la orientación EXIF ​​y gire la imagen usando ImageMagick

82

Las DSLR de Canon parecen guardar fotos en orientación horizontal y se utilizan exif::orientationpara hacer la rotación.

Pregunta: ¿Cómo se puede usar imagemagick para volver a guardar la imagen en la orientación deseada usando los datos de orientación exif de manera que ya no requiera que los datos exif se muestren en la orientación correcta?

Nyxynyx
fuente
php.net/manual/en/function.exif-read-data.php Extraiga el parámetro de rotación, pruébelo , gire la imagen si es necesario.
Marc B

Respuestas:

131

Utilice la opción de orientación automática de ImageMagick convertpara hacer esto.

convert your-image.jpg -auto-orient output.jpg

O usa mogrifypara hacerlo en su lugar

mogrify -auto-orient your-image.jpg
dlemstra
fuente
12
No olvide que puede usar en mogrifylugar de convertsi desea reemplazar el archivo existente (en el lugar), lo cual es útil cuando desea completar un directorio.
zanedp
1
No parece funcionar en todos los casos. Tengo al menos un caso en el que GIMP me pregunta si quiero arreglar la rotación, pero convertir simplemente deja la imagen como está (dejando la parte superior real de la imagen en la parte derecha).
xarlymg89
49

La forma PHP Imagick sería probar la orientación de la imagen y rotar / voltear la imagen en consecuencia:

function autorotate(Imagick $image)
{
    switch ($image->getImageOrientation()) {
    case Imagick::ORIENTATION_TOPLEFT:
        break;
    case Imagick::ORIENTATION_TOPRIGHT:
        $image->flopImage();
        break;
    case Imagick::ORIENTATION_BOTTOMRIGHT:
        $image->rotateImage("#000", 180);
        break;
    case Imagick::ORIENTATION_BOTTOMLEFT:
        $image->flopImage();
        $image->rotateImage("#000", 180);
        break;
    case Imagick::ORIENTATION_LEFTTOP:
        $image->flopImage();
        $image->rotateImage("#000", -90);
        break;
    case Imagick::ORIENTATION_RIGHTTOP:
        $image->rotateImage("#000", 90);
        break;
    case Imagick::ORIENTATION_RIGHTBOTTOM:
        $image->flopImage();
        $image->rotateImage("#000", 90);
        break;
    case Imagick::ORIENTATION_LEFTBOTTOM:
        $image->rotateImage("#000", -90);
        break;
    default: // Invalid orientation
        break;
    }
    $image->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
}

La función podría usarse así:

$img = new Imagick('/path/to/file');
autorotate($img);
$img->stripImage(); // if you want to get rid of all EXIF data
$img->writeImage();
tarleb
fuente
2
¡Esta solución funciona! Solo probé una imagen y, por supuesto, hay 8, pero te dejaré saber cómo va. Para mí fue rotateImage, -> rotate just breaks
Jack Franzen
3
Gracias, arreglé las rotateImagecosas. Si desea probar todas las orientaciones: hay un repositorio github ordenado que tiene una imagen para cada valor exif.
tarleb
¡Gracias! trabajó en c #. Solo necesitaba una pequeña conversión.
Alvin