एक्ज़िम ओरिएंटेशन का पता लगाएँ और ImageMagick का उपयोग करके छवि को घुमाएँ


83

कैनन DSLRs लैंडस्केप ओरिएंटेशन और उपयोगों में फ़ोटो को बचाने के लिए दिखाई देते हैं exif::orientation रोटेशन करने के लिए है।

प्रश्न: एक्सफ़िम ओरिएंटेशन डेटा का उपयोग करके इमेज को फिर से सेव करने के लिए इमेजमैगिक का उपयोग कैसे किया जा सकता है, ताकि इसे सही ओरिएंटेशन में प्रदर्शित करने के लिए एक्सिफ़ डेटा की आवश्यकता न हो?


php.net/manual/en/function.exif-read-data.php रोटेशन पैरामीटर निकालें, परीक्षण करें, यदि आवश्यक हो तो छवि को घुमाएं।
मार्क बी

जवाबों:


132

का प्रयोग करें ऑटो ओरिएंट ImageMagick का विकल्प नहीं है convertयह करने के लिए।

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

या mogrifyजगह में यह करने के लिए उपयोग करें

mogrify -auto-orient your-image.jpg

12
यदि आप मौजूदा फ़ाइल (इन-प्लेस) को बदलना चाहते हैं mogrify, convertतो इसके बजाय आप इसका उपयोग नहीं कर सकते हैं , जो तब होता है जब आप एक निर्देशिका पूर्ण करना चाहते हैं।
ज़नदीप

1
सभी मामलों में काम नहीं करता है। मेरे पास कम से कम एक मामला है जो जीआईएमपी मुझसे पूछता है कि क्या मैं रोटेशन को ठीक करना चाहता हूं, लेकिन कन्वर्ट बस छवि को छोड़ देता है जैसा कि यह है (चित्र के वास्तविक ऊपरी हिस्से को दाहिने हिस्से में छोड़कर)।
xarlymg89

49

PHP इमेजिक तरीका छवि अभिविन्यास का परीक्षण करने और तदनुसार छवि को घुमाने / पलटने का होगा:

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

फ़ंक्शन का उपयोग इस तरह किया जा सकता है:

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

2
यह समाधान काम करता है! मैंने केवल 1 छवि की कोशिश की है और बेशक 8 हैं, लेकिन मैं आपको बता दूंगा कि यह कैसे होता है। मेरे लिए यह रोटोमैज था, -> रोटेट बस ब्रेक
जैक

3
धन्यवाद, rotateImageसामान तय किया । यदि आप सभी झुकावों का परीक्षण करना चाहते हैं: एक साफ जीथुब रेपो है जिसमें प्रत्येक एक्सिफ मूल्य के लिए एक छवि है।
तारबेल

धन्यवाद! c # में काम किया। मुझे बस थोड़े रूपांतरण की जरूरत थी।
एल्विन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.