web-dev-qa-db-fra.com

Détecter l'orientation EXIF ​​et faire pivoter l'image à l'aide d'ImageMagick

Les reflex numériques Canon semblent enregistrer des photos en orientation paysage et utilisent exif::orientation pour faire la rotation.

Question: Comment imagemagick peut-il être utilisé pour réenregistrer l'image dans l'orientation voulue en utilisant les données d'orientation exif de telle sorte qu'il n'a plus besoin que les données exif s'affichent dans la bonne orientation?

61
Nyxynyx

Utilisez l'option auto-orient du convert d'ImageMagick pour ce faire.

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

Ou utilisez mogrifypour le faire sur place

mogrify -auto-orient your-image.jpg
99
dlemstra

La méthode PHP Imagick serait de tester l'orientation de l'image et de faire pivoter/retourner l'image en conséquence:

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);
    return $image;
}

La fonction peut être utilisée comme ceci:

$img = new Imagick('/path/to/file');
autorotate($img);
$img->stripImage(); // if you want to get rid of all EXIF data
$img->writeImage();
42
tarleb