Phát hiện định hướng EXIF ​​và xoay hình ảnh bằng ImageMagick


82

Máy ảnh DSLR của Canon dường như lưu ảnh theo hướng ngang và sử dụng exif::orientationđể thực hiện việc xoay.

Câu hỏi: Làm cách nào để sử dụng imagemagick để lưu lại hình ảnh theo hướng đã định bằng cách sử dụng dữ liệu hướng exif để không còn yêu cầu dữ liệu exif hiển thị theo hướng chính xác?


php.net/manual/en/ Chức năng.exif-read-data.php Giải nén tham số xoay, kiểm tra nó, xoay ảnh nếu cần.
Marc B

Câu trả lời:


131

Sử dụng tùy chọn tự động định hướng của ImageMagick convertđể thực hiện việc này.

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

Hoặc sử dụng mogrifyđể làm điều đó tại chỗ

mogrify -auto-orient your-image.jpg

12
Đừng quên bạn có thể sử dụng mogrifythay thế convertnếu bạn muốn thay thế tệp hiện có (tại chỗ), điều này rất hữu ích khi bạn muốn làm đầy một thư mục.
zanedp

1
Dường như không hoạt động trong mọi trường hợp. Tôi có ít nhất một trường hợp mà GIMP hỏi tôi có muốn sửa lỗi xoay hay không, nhưng chuyển đổi chỉ để nguyên hình ảnh (để lại phần trên thực của hình ở phần bên phải).
xarlymg89

49

Cách PHP Imagick sẽ là kiểm tra hướng hình ảnh và xoay / lật hình ảnh cho phù hợp:

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);
}

Hàm có thể được sử dụng như thế này:

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

2
Giải pháp này hoạt động! Tôi chỉ thử 1 hình ảnh và tất nhiên có 8 hình ảnh, nhưng tôi sẽ cho bạn biết nó diễn ra như thế nào. Đối với tôi đó là rotateImage, -> xoay chỉ phá vỡ
Jack Franzen

3
Cảm ơn, đã sửa các rotateImagethứ. Nếu bạn muốn kiểm tra tất cả các hướng: Có một repo github gọn gàng có hình ảnh cho mỗi giá trị exif.
tarleb

cảm ơn! đã làm việc trong c #. tôi chỉ cần một chút chuyển đổi.
Alvin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.