PHP read_exif_data और अभिविन्यास समायोजित करें




orientation (8)

यदि अभिविन्यास बंद है तो मैं अपलोड की गई जेपीईजी छवि को घुमाने के लिए निम्न कोड का उपयोग कर रहा हूं। मुझे केवल iPhones और Android से अपलोड की गई छवियों में समस्याएं आ रही हैं।

if(move_uploaded_file($_FILES['photo']['tmp_name'], $upload_path . $newfilename)){
            chmod($upload_path . $newfilename, 0755);
            $exif = exif_read_data($upload_path . $newfilename);
            $ort = $exif['IFD0']['Orientation'];
            switch($ort)
            {

                case 3: // 180 rotate left
                    $image->imagerotate($upload_path . $newfilename, 180, -1);
                    break;


                case 6: // 90 rotate right
                    $image->imagerotate($upload_path . $newfilename, -90, -1);
                    break;

                case 8:    // 90 rotate left
                    $image->imagerotate($upload_path . $newfilename, 90, -1);
                    break;
            }
            imagejpeg($image, $upload_path . $newfilename, 100);
            $success_message = 'Photo Successfully Uploaded';
        }else{
            $error_count++;
            $error_message = 'Error: Upload Unsuccessful<br />Please Try Again';
        }

क्या मैं जेपीईजी से EXIF ​​डेटा पढ़ने के तरीके से कुछ गलत कर रहा हूं? यह छवियों को घूर्णन नहीं कर रहा है जैसा कि यह माना जाता है।

यह तब होता है जब मैं var_dump ($ exif) चलाता हूं;

array(41) {
    ["FileName"]=> string(36) "126e7c0efcac2b76b3320e6187d03cfd.JPG"
    ["FileDateTime"]=> int(1316545667)
    ["FileSize"]=> int(1312472)
    ["FileType"]=> int(2)
    ["MimeType"]=> string(10) "image/jpeg"
    ["SectionsFound"]=> string(30) "ANY_TAG, IFD0, THUMBNAIL, EXIF"
    ["COMPUTED"]=> array(8) {
        ["html"]=> string(26) "width="2048" height="1536""
        ["Height"]=> int(1536)
        ["Width"]=> int(2048)
        ["IsColor"]=> int(1)
        ["ByteOrderMotorola"]=> int(1)
        ["ApertureFNumber"]=> string(5) "f/2.8"
        ["Thumbnail.FileType"]=> int(2)
        ["Thumbnail.MimeType"]=> string(10) "image/jpeg" }
        ["Make"]=> string(5) "Apple"
        ["Model"]=> string(10) "iPhone 3GS"
        ["Orientation"]=> int(6)
        ["XResolution"]=> string(4) "72/1"
            ["YResolution"]=> string(4) "72/1" ["ResolutionUnit"]=> int(2) ["Software"]=> string(5) "4.3.5" ["DateTime"]=> string(19) "2011:09:16 21:18:46" ["YCbCrPositioning"]=> int(1) ["Exif_IFD_Pointer"]=> int(194) ["THUMBNAIL"]=> array(6) { ["Compression"]=> int(6) ["XResolution"]=> string(4) "72/1" ["YResolution"]=> string(4) "72/1" ["ResolutionUnit"]=> int(2) ["JPEGInterchangeFormat"]=> int(658) ["JPEGInterchangeFormatLength"]=> int(8231) } ["ExposureTime"]=> string(4) "1/15" ["FNumber"]=> string(4) "14/5" ["ExposureProgram"]=> int(2) ["ISOSpeedRatings"]=> int(200) ["ExifVersion"]=> string(4) "0221" ["DateTimeOriginal"]=> string(19) "2011:09:16 21:18:46" ["DateTimeDigitized"]=> string(19) "2011:09:16 21:18:46" ["ComponentsConfiguration"]=> string(4) "" ["ShutterSpeedValue"]=> string(8) "3711/949" ["ApertureValue"]=> string(9) "4281/1441" ["MeteringMode"]=> int(1) ["Flash"]=> int(32) ["FocalLength"]=> string(5) "77/20" ["SubjectLocation"]=> array(4) { [0]=> int(1023) [1]=> int(767) [2]=> int(614) [3]=> int(614) } ["FlashPixVersion"]=> string(4) "0100" ["ColorSpace"]=> int(1) ["ExifImageWidth"]=> int(2048) ["ExifImageLength"]=> int(1536) ["SensingMethod"]=> int(2) ["ExposureMode"]=> int(0) ["WhiteBalance"]=> int(0) ["SceneCaptureType"]=> int(0) ["Sharpness"]=> int(1) }

jhead -autorot jpegfile.jpg

इस तक पहुंचने का भी एक उपयोगी तरीका है।

जेड लिनक्स में एक मानक प्रोग्राम है (इंस्टॉल करने के लिए 'sudo apt-get install jhead' का उपयोग करें), यह विकल्प उन्मुखीकरण को देखता है और छवि को सही ढंग से घुमाता है और केवल तभी नुकसान पहुंचाता है जब इसकी आवश्यकता हो। इसके बाद यह EXIF ​​डेटा को सही तरीके से अपडेट करता है।

इस तरह आप एक जेपीईजी (या फ़ोल्डर में एकाधिक जेपीजी) को एक साधारण एक-पास तरीके से संसाधित कर सकते हैं जो रोटेशन समस्याओं को स्थायी रूप से ठीक करता है।

उदाहरण: jhead -autorot * .jpg प्रारंभिक प्रश्न में ओपी की आवश्यकता के तरीके में जेपीजी छवियों का एक संपूर्ण फ़ोल्डर ठीक करेगा।

हालांकि यह तकनीकी रूप से PHP नहीं है, मैंने इस धागे को पढ़ा है और उसके बाद मेरे जेड सुझाव का उपयोग किया है, जिसे पीएचपी सिस्टम () कॉल से बुलाया गया है, जिसके परिणामस्वरूप मैं ओपी के साथ संयोग कर रहा था: छवियों को घुमाने के लिए किसी भी सॉफ्टवेयर (जैसे 'एफबीआई' 'रास्पियन में) उन्हें सही ढंग से प्रदर्शित कर सकता है।

इस के प्रकाश में मैंने सोचा कि दूसरों को यह जानने से फायदा हो सकता है कि जेड इस समस्या को कितनी आसानी से हल करता है और जानकारी केवल सूचनात्मक उद्देश्यों के लिए पोस्ट करता है - क्योंकि किसी ने पहले इसका उल्लेख नहीं किया था।


यहां मैं पूरी बात समझा रहा हूं, मैं लैरावेल का उपयोग करता हूं और छवि हस्तक्षेप पैकेज का उपयोग करता हूं।

सबसे पहले, मुझे अपनी छवि मिलती है और इसे बदलने के लिए मेरे किसी अन्य फ़ंक्शन पर भेजती है और कुछ अन्य कार्यक्षमता, अगर हमें इसकी आवश्यकता नहीं है, तो आप छोड़ सकते हैं ...

फ़ाइल को मेरे नियंत्रक में एक विधि के साथ पकड़ो,

 public  function getImageFile(Request $request){
    $image = $request->image;
    $this->imageUpload($image);
}

अब, मैं इसे आकार देने और छवि का नाम और विस्तार प्राप्त करने के लिए भेजता हूं ...

public function  imageUpload($file){
    ini_set('memory_limit', '-1');
    $directory = 'uploads/';
    $name = str_replace([" ", "."], "_", $file->getClientOriginalName()) . "_";
    $file_name = $name . time() . rand(1111, 9999) . '.' . $file->getClientOriginalExtension();
    //path set
    $img_url = $directory.$file_name;
    list($width, $height) = getimagesize($file);
    $h = ($height/$width)*600;
    Image::make($file)->resize(600, $h)->save(public_path($img_url));
    $this->image_fix_orientation($file,$img_url);
    return $img_url;
}

अब मैं अपनी छवि अभिविन्यास समारोह को कॉल करता हूं,

 public function image_fix_orientation($file,$img_url ) {
    $data = Image::make($file)->exif();
    if (!empty($data['Orientation'])) {
        $image = imagecreatefromjpeg($file);
        switch ($data['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }

        imagejpeg($image, $img_url, 90);
    }

}

और बस यही...


यह उल्लेख करना शायद सार्थक है कि यदि आप कमांड लाइन से ImageMagick का उपयोग कर रहे हैं, तो आप -auto-orient विकल्प का उपयोग कर सकते हैं जो मौजूदा EXIF ​​ओरिएंटेशन डेटा के आधार पर छवि को घुमाएगा।

convert -auto-orient /tmp/uploadedImage.jpg /save/to/path/image.jpg

कृपया ध्यान दें: यदि प्रक्रिया से पहले EXIF ​​डेटा छीन लिया गया था, तो यह वर्णित के रूप में काम नहीं करेगा।


बस अगर कोई इस पर आता है। ऊपर से कुछ स्विच स्टेटमेंट्स जो मैं कर सकता हूं उससे गलत है।

here जानकारी के आधार पर, यह होना चाहिए:

switch ($exif['Orientation']) {
    case 3:
        $image = imagerotate($image, -180, 0);
        break;
    case 6:
        $image = imagerotate($image, 90, 0);
        break;
    case 8:
        $image = imagerotate($image, -90, 0);
        break;
} 

छवि अपलोड करने वालों के लिए सरल कार्य, यदि आवश्यक हो तो यह केवल ऑटोरोटेट करता है।

function image_fix_orientation($filename) {
    $exif = exif_read_data($filename);
    if (!empty($exif['Orientation'])) {
        $image = imagecreatefromjpeg($filename);
        switch ($exif['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }

        imagejpeg($image, $filename, 90);
    }
}

हस्तक्षेप छवि में एक विधि orientate()

$img = Image::make('foo.jpg')->orientate();

मुझे अभिविन्यास मूल्यों के एक और सेट के साथ झुकाव से नफरत है, लेकिन ऊपर सूचीबद्ध किसी भी मूल्य का उपयोग करके मेरे अनुभव में, मैं सीधे आईफोन से पोर्ट्रेट ओरिएंटेशन शॉट्स अपलोड करते समय छवियों को उल्टा कर देता हूं। यहां स्विच स्टेटमेंट है जिसके साथ मैं समाप्त हुआ।

switch ($exif['Orientation']) {
        case 3:
            $image = imagerotate($image, -180, 0);
            break;

        case 6:
            $image = imagerotate($image, -90, 0);
            break;

        case 8:
            $image = imagerotate($image, 90, 0);
            break;
    }

डैनियल के कोड के आधार पर मैंने एक ऐसा फ़ंक्शन लिखा जो आवश्यकतानुसार एक छवि को घुमाता है, बिना किसी अनुकरण के।

जी.डी.

function image_fix_orientation(&$image, $filename) {
    $exif = exif_read_data($filename);

    if (!empty($exif['Orientation'])) {
        switch ($exif['Orientation']) {
            case 3:
                $image = imagerotate($image, 180, 0);
                break;

            case 6:
                $image = imagerotate($image, -90, 0);
                break;

            case 8:
                $image = imagerotate($image, 90, 0);
                break;
        }
    }
}

एक लाइन संस्करण (जीडी)

function image_fix_orientation(&$image, $filename) {
    $image = imagerotate($image, array_values([0, 0, 0, 180, 0, 0, -90, 0, 90])[@exif_read_data($filename)['Orientation'] ?: 0], 0);
}

ImageMagick

function image_fix_orientation($image) {
    if (method_exists($image, 'getImageProperty')) {
        $orientation = $image->getImageProperty('exif:Orientation');
    } else {
        $filename = $image->getImageFilename();

        if (empty($filename)) {
            $filename = 'data://image/jpeg;base64,' . base64_encode($image->getImageBlob());
        }

        $exif = exif_read_data($filename);
        $orientation = isset($exif['Orientation']) ? $exif['Orientation'] : null;
    }

    if (!empty($orientation)) {
        switch ($orientation) {
            case 3:
                $image->rotateImage('#000000', 180);
                break;

            case 6:
                $image->rotateImage('#000000', 90);
                break;

            case 8:
                $image->rotateImage('#000000', -90);
                break;
        }
    }
}




exif