जेएस क्लाइंट-साइड एक्सिफ़ ओरिएंटेशन: रोटेट एंड मिरर जेपीईजी इमेजेस


154

डिजिटल कैमरा फोटो को अक्सर एक्जिफ़ "ओरिएंटेशन" टैग के साथ JPEG के रूप में सहेजा जाता है। सही ढंग से प्रदर्शित करने के लिए, छवियों को घुमाया / प्रतिबिंबित किया जाना चाहिए जिसके आधार पर अभिविन्यास निर्धारित किया गया है, लेकिन ब्राउज़र इस जानकारी को छवि प्रदान करने की उपेक्षा करते हैं। यहां तक ​​कि बड़े वाणिज्यिक वेब ऐप में, EXIF ​​अभिविन्यास के लिए समर्थन धब्बेदार 1 हो सकता है । एक ही स्रोत 8 अलग-अलग झुकावों का एक अच्छा सारांश प्रदान करता है जो एक JPEG हो सकता है:

EXIF अभिविन्यास का सारांश

नमूना चित्र 4 पर उपलब्ध हैं ।

सवाल यह है कि क्लाइंट की तरफ से इमेज को कैसे घुमाया / मिरर किया जाए ताकि वह सही ढंग से प्रदर्शित हो और आवश्यक होने पर आगे की प्रक्रिया की जा सके?

अभिविन्यास विशेषता 2 सहित EXIF ​​डेटा को पार्स करने के लिए जेएस लाइब्रेरी उपलब्ध हैं । फ़्लिकर ने संभावित प्रदर्शन समस्या का उल्लेख किया जब बड़ी छवियों को पार्स करना, वेबवर्क 3 के उपयोग की आवश्यकता थी ।

कंसोल उपकरण सही ढंग से छवियों को 5 उन्मुख कर सकते हैं । समस्या को हल करने वाली एक PHP स्क्रिप्ट 6 पर उपलब्ध है

जवाबों:


145

जीथब प्रोजेक्ट जावास्क्रिप्ट-लोड-इमेज EXIF ओरिएंटेशन समस्या का एक संपूर्ण समाधान प्रदान करता है, सभी 8 एक्सिफ ओरिएंटेशन के लिए छवियों को सही ढंग से घूर्णन / प्रतिबिंबित करता है। जावास्क्रिप्ट एक्सिफ़ ओरिएंटेशन का ऑनलाइन डेमो देखें

छवि HTML5 कैनवास पर खींची गई है। इसका सही प्रतिपादन js / लोड-इमेज-ओरिएंटेशन . js में लागू किया गया है कैनवस ऑपरेशंस के जरिए . गया है।

आशा है कि यह किसी और समय को बचाता है, और इस खुले स्रोत मणि के बारे में खोज इंजन सिखाता है :)


1
मैं इस पुस्तकालय का उपयोग कर रहा हूं, लेकिन हाल ही में यह iOS 8.3 पर टूट गया, जहां मुझे सबसे ज्यादा काम करने की जरूरत है :(
गॉर्डन सन

2
मैं वास्तव में यह देखने के लिए संघर्ष कर रहा हूं कि यह कैसे सहायक है। मैं इसे सीखने की कोशिश कर रहा हूं, इसलिए मैं इसे एक पेज पार्स कर सकता हूं और छवियों को घुमा सकता हूं जब उन्हें घुमाए जाने की आवश्यकता होती है, या वास्तव में अपलोड करने से पहले ओरिएंटेशन और रोटेट फ़ाइल (किसी तरह) का पता लगाते हैं। डेमो न तो करता है। यह बस एक फ़ाइल इनपुट से एक फ़ाइल लेता है और इसे सही तरीके से प्रदर्शित करता है, वास्तविक दुनिया में यह कब उपयोगी है? जब मैं अपने पृष्ठ को पार्स करता हूं और लोड किए गए लाइब्रेरी में छवि टैग से URL फ़ीड करता हूं, तो कोई एक्सफ़ डेटा नहीं है इसलिए ऐसा नहीं कर सकते। अपलोड के लिए यह एक कैनवस ऑब्जेक्ट लौटाता है इसलिए मैं इसे सर्वर या कुछ भी नहीं भेज सकता।
इग्नोसॉरस

3
@igneosaur: आप बेस 64 एनकोडेड डेटा को सर्वर के साथ भेज सकते हैं canvas.toDataURL()और डीकोड कर सकते हैं और इसे सर्वर साइड में सेव कर सकते हैं।
ब्रुनेनिगन

1
लोड-इमेज प्रोजेक्ट का उपयोग करने के बजाय, आप इसके कुछ कोड-बेस का उपयोग अपने खुद के बेक करने के लिए कर सकते हैं - बस github.com/blueimp/JavaScript-Load-Image/blob/master/js/… में देखें
एंडी लोरेंज

1
क्या कैनवास बनाने का कोई तरीका है जो इस लाइब्रेरी को एक नियमित <img>टैग की तरह उत्तरदायी बनाता है ?
एरिक बर्कुन-ड्रेविनिग सिप

103

मेडर का संदर्भ परिवर्तन पूरी तरह से काम करता है। यदि आपको अभिविन्यास निकालने की आवश्यकता है तो केवल इस फ़ंक्शन का उपयोग करें - आपको किसी भी EXIF-रीडिंग लिब की आवश्यकता नहीं है। नीचे बेस 64 इमेज में री-सेटिंग ओरिएंटेशन के लिए एक फंक्शन है। यहाँ इसके लिए एक बेला है । मैंने अभिविन्यास निष्कर्षण डेमो के साथ एक फिडल भी तैयार किया है ।

function resetOrientation(srcBase64, srcOrientation, callback) {
  var img = new Image();    

  img.onload = function() {
    var width = img.width,
        height = img.height,
        canvas = document.createElement('canvas'),
        ctx = canvas.getContext("2d");

    // set proper canvas dimensions before transform & export
    if (4 < srcOrientation && srcOrientation < 9) {
      canvas.width = height;
      canvas.height = width;
    } else {
      canvas.width = width;
      canvas.height = height;
    }

    // transform context before drawing image
    switch (srcOrientation) {
      case 2: ctx.transform(-1, 0, 0, 1, width, 0); break;
      case 3: ctx.transform(-1, 0, 0, -1, width, height); break;
      case 4: ctx.transform(1, 0, 0, -1, 0, height); break;
      case 5: ctx.transform(0, 1, 1, 0, 0, 0); break;
      case 6: ctx.transform(0, 1, -1, 0, height, 0); break;
      case 7: ctx.transform(0, -1, -1, 0, height, width); break;
      case 8: ctx.transform(0, -1, 1, 0, 0, width); break;
      default: break;
    }

    // draw image
    ctx.drawImage(img, 0, 0);

    // export base64
    callback(canvas.toDataURL());
  };

  img.src = srcBase64;
};

7
अभिविन्यास में डिफ़ॉल्ट मामले की switchआवश्यकता नहीं है, क्योंकि यह परिवर्तन कुछ भी नहीं करता है। इसके अलावा, इसके srcOrientation > 4 && srcOrientation < 9बजाय का उपयोग करने पर विचार करें [5,6,7,8].indexOf(srcOrientation) > -1, क्योंकि यह तेज और कम संसाधन गहन (रैम और सीपीयू दोनों) है। वहाँ एक सरणी की जरूरत नहीं है। यह बहुत सारी छवियों को बैचने के लिए महत्वपूर्ण है, जहां हर बिट की गणना होती है। अन्यथा, बहुत अच्छा जवाब। Upvoted!
रायन कैस

4
@RyanCasas मुझे इस बात की जानकारी नहीं थी indexOfकि आपके द्वारा प्रस्तावित प्रस्ताव की तुलना कितनी भारी हो सकती है। मैंने 10M पुनरावृत्तियों के साथ एक सरल लूप चलाया और यह 1400% तेज था। अच्छा: D एक गुच्छा धन्यवाद!
वंडरबार्ट

1
मैंने एक Android WebView में इस उत्तर का उपयोग किया और यह पता चला, कि कुछ Android डिवाइस हैं, जो WebView का समर्थन WebView में नहीं करते हैं (देखें bugs.chromium.org/p/chromium/issues/detail?id=555256 ) छवि के आकार के आधार पर ऐसे उपकरणों पर रोटेशन बहुत लंबा हो सकता है।
ndreisg

1
जब संदर्भित के साथ उपयोग किया जाता है getOrientation, तो मैं उत्सुक हूं कि क्या यह प्रदर्शन के मामले में कुशल है। getOrientationकॉल fileReader.readAsArrayBuffer, कॉल और फिर हम URL.createObjectURLउस परिणाम को कॉल और पास करते हैं resetOrientation, जो इस URL को एक छवि के रूप में लोड करता है। क्या इसका मतलब यह है कि छवि फ़ाइल ब्राउज़र द्वारा "लोड" / एक बार नहीं बल्कि दो बार पढ़ी जाएगी, या क्या मुझे गलतफहमी है?
ओलिवर जोसेफ ऐश

1
इसके अलावा, उन ब्राउज़रों के बारे में क्या करना है जहां अभिविन्यास पहले से ही सम्मानित किया जाएगा? मेरा मानना ​​है कि यह iOS सफारी के लिए है, और image-orientation: from-imageजब इसका उपयोग किया जाता है तो CSS का समर्थन करने वाले ब्राउज़र में ।
ओलिवर जोसेफ ऐश

40

अगर

width = img.width;
height = img.height;
var ctx = canvas.getContext('2d');

फिर आप इन परिवर्तनों का उपयोग करके छवि को अभिविन्यास 1 में बदल सकते हैं

अभिविन्यास से:

  1. ctx.transform(1, 0, 0, 1, 0, 0);
  2. ctx.transform(-1, 0, 0, 1, width, 0);
  3. ctx.transform(-1, 0, 0, -1, width, height);
  4. ctx.transform(1, 0, 0, -1, 0, height);
  5. ctx.transform(0, 1, 1, 0, 0, 0);
  6. ctx.transform(0, 1, -1, 0, height, 0);
  7. ctx.transform(0, -1, -1, 0, height, width);
  8. ctx.transform(0, -1, 1, 0, 0, width);

Ctx पर चित्र बनाने से पहले


58
यहाँ भी क्या हो रहा है?
मुहम्मद उमेर

1
इसके साथ आपको सिर्फ ओरिएंटेशन (जैसे EXIF ​​के माध्यम से) जानना होगा और फिर आवश्यकतानुसार घूमना होगा। जो मैं चाह रहा हूं उसका आधा।
ब्रेंडेन

2
इन परिवर्तनों ने मेरे लिए काम नहीं किया - इसके बजाय मैंने github.com/blueimp/JavaScript-Load-Image/blob/master/js/… पर लोड-इमेज प्रोजेक्ट से कोड का उपयोग किया जो मुझे विश्वास है कि अच्छी तरह से सिद्ध कोड है। जो दोनों अनुवादों का उपयोग करता है, कैनवास के संदर्भ में संचालन को घुमाता है और साथ ही एक चौड़ाई / ऊंचाई स्वैप करता है। आदि बदलने के अन्य प्रयासों के साथ कई घंटों के प्रयोग के बाद मुझे 100% परिणाम दिए
एंडी लॉरेंज

1
जब आप छवि को ctx पर खींचते हैं तो यह क्यों महत्वपूर्ण है? उस पर चित्र बनाने के बाद आप कैनवास को घुमा नहीं सकते?
AlxVallejo

अभिविन्यास के लिए रोटेशन 8 मेरे लिए इस तरह से काम करता है: ctx.transform (0, -1, 1, 0, 0, ऊंचाई);
जियोर्जियो बारचीस

24

ठीक है @ user3096626 जवाब के अलावा, मुझे लगता है कि यह अधिक उपयोगी होगा यदि कोई व्यक्ति कोड उदाहरण प्रदान करता है, तो निम्न उदाहरण आपको दिखाएगा कि छवि अभिविन्यास कैसे ठीक किया जाए, यह यूआरएल (दूरस्थ छवियों) से आता है:


समाधान 1: जावास्क्रिप्ट का उपयोग करना (अनुशंसित)

  1. क्योंकि लोड-इमेज लाइब्रेरी केवल url छवियों (फ़ाइल / ब्लॉब) से exif टैग नहीं निकालती है, हम एक्सफ़-जेएस और लोड-इमेज जावास्क्रिप्ट लाइब्रेरी दोनों का उपयोग करेंगे , इसलिए पहले इन पुस्तकालयों को निम्नानुसार अपने पेज पर जोड़ें:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/exif-js/2.1.0/exif.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-load-image/2.12.2/load-image.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-load-image/2.12.2/load-image-scale.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-load-image/2.12.2/load-image-orientation.min.js"></script>

    ध्यान दें कि exif-js के संस्करण 2.2 में समस्याएँ हैं इसलिए हमने 2.1 का उपयोग किया

  2. फिर मूल रूप से हम क्या करेंगे

    a - इमेज का उपयोग करके लोड करें window.loadImage()

    ख - उपयोग exif टैग पढ़ें window.EXIF.getData()

    c - छवि को कैनवस में रूपांतरित करें और उपयोग करके छवि अभिविन्यास ठीक करें window.loadImage.scale()

    d - कैनवास को दस्तावेज़ में रखें

हेयर यू गो :)

window.loadImage("/your-image.jpg", function (img) {
  if (img.type === "error") {
    console.log("couldn't load image:", img);
  } else {
    window.EXIF.getData(img, function () {
        var orientation = EXIF.getTag(this, "Orientation");
        var canvas = window.loadImage.scale(img, {orientation: orientation || 0, canvas: true});
        document.getElementById("container").appendChild(canvas); 
        // or using jquery $("#container").append(canvas);

    });
  }
});

बेशक, आप छवि को कैनवास ऑब्जेक्ट से बेस 64 के रूप में प्राप्त कर सकते हैं और इसे img src विशेषता में रख सकते हैं, इसलिए jQuery का उपयोग करके आप कर सकते हैं;)

$("#my-image").attr("src",canvas.toDataURL());

यहाँ पूरा कोड है: github: https://github.com/digital-flowers/loadimage-exif-xample


समाधान 2: html (ब्राउज़र हैक) का उपयोग करना

एक बहुत ही त्वरित और आसान हैक है, अधिकांश ब्राउज़र छवि को सही अभिविन्यास में प्रदर्शित करते हैं यदि छवि को किसी भी HTML के बिना सीधे एक नए टैब के अंदर खोला जाता है (LOL मुझे नहीं पता क्यों), इसलिए मूल रूप से आप iframe का उपयोग करके अपनी छवि प्रदर्शित कर सकते हैं सीधे छवि url के रूप में iframe src विशेषता डालकर:

<iframe src="/my-image.jpg"></iframe>

समाधान 3: सीएसएस (केवल फ़ायरफ़ॉक्स और आईओएस पर सफारी) का उपयोग करना

छवि अभिविन्यास को ठीक करने के लिए css3 विशेषता है, लेकिन यह समस्या केवल फ़ायरफ़ॉक्स और सफारी / आईओएस पर काम कर रही है, यह अभी भी ध्यान देने योग्य है क्योंकि जल्द ही यह सभी ब्राउज़रों के लिए उपलब्ध होगा ( caniuse से ब्राउज़र समर्थन जानकारी )

img {
   image-orientation: from-image;
}

समाधान 1 ने मेरे लिए काम नहीं किया। यह खिड़की पर लौट रहा है। लोडेज अपरिभाषित है
पेरी

यह तब हुआ जब आपने चरण 1 में मेरे द्वारा
उल्लिखित

मैंने पुस्तकालयों को शामिल किया। मुझे आपके उदाहरण की सरलता पसंद है लेकिन मुझे वह त्रुटि संदेश मिलता रहता है।
पेरी

1
ऐसा लगता है कि exif-js टूट गया था, कृपया मेरे संपादन की जांच करें मैंने भी github पर पूरा कोड जोड़ा है: github.com/digital-flowers/loadimage-exif-example
फरीद अलंक्रूटी

1
ठीक है चेकआउट github परियोजना में एक नई फ़ाइल "upload.html" है, आप का स्वागत है :)
फरीद अलमृतौली

10

उन लोगों के लिए, जिनके पास इनपुट नियंत्रण से एक फ़ाइल है, यह नहीं जानते कि इसका अभिविन्यास क्या है, थोड़ा आलसी हैं और नीचे एक बड़ी लाइब्रेरी को शामिल नहीं करना चाहते हैं, यह कोड @underBart द्वारा प्रदान किया गया कोड है, जिसके उत्तर में वह लिंक करता है ( https://stackoverflow.com/a/32490603 ) जो अभिविन्यास पाता है।

function getDataUrl(file, callback2) {
        var callback = function (srcOrientation) {
            var reader2 = new FileReader();
            reader2.onload = function (e) {
                var srcBase64 = e.target.result;
                var img = new Image();

                img.onload = function () {
                    var width = img.width,
                        height = img.height,
                        canvas = document.createElement('canvas'),
                        ctx = canvas.getContext("2d");

                    // set proper canvas dimensions before transform & export
                    if (4 < srcOrientation && srcOrientation < 9) {
                        canvas.width = height;
                        canvas.height = width;
                    } else {
                        canvas.width = width;
                        canvas.height = height;
                    }

                    // transform context before drawing image
                    switch (srcOrientation) {
                        case 2: ctx.transform(-1, 0, 0, 1, width, 0); break;
                        case 3: ctx.transform(-1, 0, 0, -1, width, height); break;
                        case 4: ctx.transform(1, 0, 0, -1, 0, height); break;
                        case 5: ctx.transform(0, 1, 1, 0, 0, 0); break;
                        case 6: ctx.transform(0, 1, -1, 0, height, 0); break;
                        case 7: ctx.transform(0, -1, -1, 0, height, width); break;
                        case 8: ctx.transform(0, -1, 1, 0, 0, width); break;
                        default: break;
                    }

                    // draw image
                    ctx.drawImage(img, 0, 0);

                    // export base64
                    callback2(canvas.toDataURL());
                };

                img.src = srcBase64;
            }

            reader2.readAsDataURL(file);
        }

        var reader = new FileReader();
        reader.onload = function (e) {

            var view = new DataView(e.target.result);
            if (view.getUint16(0, false) != 0xFFD8) return callback(-2);
            var length = view.byteLength, offset = 2;
            while (offset < length) {
                var marker = view.getUint16(offset, false);
                offset += 2;
                if (marker == 0xFFE1) {
                    if (view.getUint32(offset += 2, false) != 0x45786966) return callback(-1);
                    var little = view.getUint16(offset += 6, false) == 0x4949;
                    offset += view.getUint32(offset + 4, little);
                    var tags = view.getUint16(offset, little);
                    offset += 2;
                    for (var i = 0; i < tags; i++)
                        if (view.getUint16(offset + (i * 12), little) == 0x0112)
                            return callback(view.getUint16(offset + (i * 12) + 8, little));
                }
                else if ((marker & 0xFF00) != 0xFF00) break;
                else offset += view.getUint16(offset, false);
            }
            return callback(-1);
        };
        reader.readAsArrayBuffer(file);
    }

जिसे आसानी से ऐसे कहा जा सकता है

getDataUrl(input.files[0], function (imgBase64) {
      vm.user.BioPhoto = imgBase64;
});

2
Google द्वारा 2 घंटे से अधिक की खोज के बाद धन्यवाद, मुझे सही समाधान मिल गया है।
श्री तरु जु

2
क्यों कोई हल्का समाधान पसंद करने के लिए आलसी होगा?
ओस

4
टाइपस्क्रिप्ट में पोर्ट किया गया और लगभग 4 सेकंड से ~ 20 मिलीसेकंड तक अनुकूलित किया गया। Base64 एन्कोडिंग अड़चन थी - image/jpegडिफ़ॉल्ट के बजाय का उपयोग करना image/png, और आउटपुट छवि को अधिकतम चौड़ाई (400px मेरे मामले में) के आकार में बदलना एक भारी अंतर बना। (यह थंबनेल के लिए अच्छी तरह से काम करता है, लेकिन अगर आपको पूरी छवि प्रदर्शित करनी है, तो मैं सुझाव
दूंगा

8

मेरे लिए WunderBart का जवाब सबसे अच्छा था। ध्यान दें कि आप इसे बहुत गति दे सकते हैं यदि आपकी छवियां अक्सर सही तरीके से होती हैं, बस पहले अभिविन्यास का परीक्षण करके और बाकी कोड को दरकिनार करके यदि कोई रोटेशन की आवश्यकता नहीं है।

सभी जानकारी एक साथ wunderbart से लाना, कुछ इस तरह;

var handleTakePhoto = function () {
    let fileInput: HTMLInputElement = <HTMLInputElement>document.getElementById('photoInput');
    fileInput.addEventListener('change', (e: any) => handleInputUpdated(fileInput, e.target.files));
    fileInput.click();
}

var handleInputUpdated = function (fileInput: HTMLInputElement, fileList) {
    let file = null;

    if (fileList.length > 0 && fileList[0].type.match(/^image\//)) {
        isLoading(true);
        file = fileList[0];
        getOrientation(file, function (orientation) {
            if (orientation == 1) {
                imageBinary(URL.createObjectURL(file));
                isLoading(false);
            }
            else 
            {
                resetOrientation(URL.createObjectURL(file), orientation, function (resetBase64Image) {
                    imageBinary(resetBase64Image);
                    isLoading(false);
                });
            }
        });
    }

    fileInput.removeEventListener('change');
}


// from http://stackoverflow.com/a/32490603
export function getOrientation(file, callback) {
    var reader = new FileReader();

    reader.onload = function (event: any) {
        var view = new DataView(event.target.result);

        if (view.getUint16(0, false) != 0xFFD8) return callback(-2);

        var length = view.byteLength,
            offset = 2;

        while (offset < length) {
            var marker = view.getUint16(offset, false);
            offset += 2;

            if (marker == 0xFFE1) {
                if (view.getUint32(offset += 2, false) != 0x45786966) {
                    return callback(-1);
                }
                var little = view.getUint16(offset += 6, false) == 0x4949;
                offset += view.getUint32(offset + 4, little);
                var tags = view.getUint16(offset, little);
                offset += 2;

                for (var i = 0; i < tags; i++)
                    if (view.getUint16(offset + (i * 12), little) == 0x0112)
                        return callback(view.getUint16(offset + (i * 12) + 8, little));
            }
            else if ((marker & 0xFF00) != 0xFF00) break;
            else offset += view.getUint16(offset, false);
        }
        return callback(-1);
    };

    reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
};

export function resetOrientation(srcBase64, srcOrientation, callback) {
    var img = new Image();

    img.onload = function () {
        var width = img.width,
            height = img.height,
            canvas = document.createElement('canvas'),
            ctx = canvas.getContext("2d");

        // set proper canvas dimensions before transform & export
        if (4 < srcOrientation && srcOrientation < 9) {
            canvas.width = height;
            canvas.height = width;
        } else {
            canvas.width = width;
            canvas.height = height;
        }

        // transform context before drawing image
        switch (srcOrientation) {
            case 2: ctx.transform(-1, 0, 0, 1, width, 0); break;
            case 3: ctx.transform(-1, 0, 0, -1, width, height); break;
            case 4: ctx.transform(1, 0, 0, -1, 0, height); break;
            case 5: ctx.transform(0, 1, 1, 0, 0, 0); break;
            case 6: ctx.transform(0, 1, -1, 0, height, 0); break;
            case 7: ctx.transform(0, -1, -1, 0, height, width); break;
            case 8: ctx.transform(0, -1, 1, 0, 0, width); break;
            default: break;
        }

        // draw image
        ctx.drawImage(img, 0, 0);

        // export base64
        callback(canvas.toDataURL());
    };

    img.src = srcBase64;
}

1
महान दृष्टिकोण। आपको इसे संभालने -2और -1वापस लौटने पर भी विचार करना चाहिए getOrientationताकि आप रोटेशन डेटा के बिना गैर-जेपीजी या छवियों को घुमाने की कोशिश न करें।
स्टीवन लैंबर्ट

मैंने और अधिक अनुकूलन किए, ऊपर मेरी टिप्पणी देखें - मैंने अभी भी आपका file.slice()अनुकूलन जोड़ा है , लेकिन वास्तविक बढ़ावा image/jpegछोटे डेटा URL का निर्माण करने के लिए छोटी छवियों और आउटपुट प्रारूप का उपयोग करने से आता है । (10-मेगापिक्सेल छवियों के लिए भी कोई ध्यान देने योग्य देरी नहीं है।)
mindplay.dk

के साथ सावधानी से file.slice(), जैसा कि आप बेस 64 छवि स्रोतों के समर्थन को रोकेंगे।
मार्क

धन्यवाद चिह्न - देखभाल एक विकल्प के लिए एक संपादन प्रदान करने के लिए?
स्टेटलर

7

एक लाइनर किसी को?

मैंने किसी को browser-image-compressionपुस्तकालय का उल्लेख करते नहीं देखा । इसे इसके लिए एक हेल्पर फंक्शन मिला है।

उपयोग: const orientation = await imageCompression.getExifOrientation(file)

इस तरह के एक उपयोगी उपकरण कई अन्य तरीकों से भी।


इससे ओरिएंटेशन मिलता है। लेकिन मैं इस जानकारी का उपयोग करके ग्राहक पक्ष पर एक नई .jpg फ़ाइल वस्तु का उत्पादन कैसे करूं?
मास्टरएक्सिलो

Fileजहाँ तक मुझे पता है आप वस्तुओं का निर्माण नहीं कर सकते । अगली सबसे अच्छी बात छवि और सर्वर के लिए अभिविन्यास भेजना होगा, और वहां फ़ाइल हेरफेर करना होगा। या आप एक बेस 64 स्ट्रिंग का उपयोग करके canvasऔर toDataURLविधि उत्पन्न कर सकते हैं ।
गिल्बर्ट- v

1
नहीं, आप एक ब्लूब से सिर्फ ठीक फ़ाइल ऑब्जेक्ट बना सकते हैं। फ़ाइल फ़ाइल (सरणी भागों, स्ट्रिंग फ़ाइल नाम, BlobPropertyBag गुण); developer.mozilla.org/de/docs/Web/API/File
मास्टरएक्सिलो

2
सोने का स्टीकर! @ मास्टरएक्सिलो
गिल्बर्ट- v

2
यह मेरे लिए बहुत अच्छा काम किया! मैं पिछले 2 दिनों से ओरिएंटेशन से जूझ रहा था! सभी ट्रांसफ़ॉर्म स्विच स्टेटमेंट जो पोस्ट किए गए थे, वे किसी कारण से मेरे फोन से पोर्ट्रेट इमेज को हैंडल नहीं करेंगे। शायद इसलिए कि मैं एक ही समय में संपीड़ित और घूमने की कोशिश कर रहा था।
cjd82187

2

मैंने एक ES6 मॉड्यूल में लिपटे हुए एक वर्ग का निर्माण किया जो इसे ठीक करता है।

यह 103 लाइनों, कोई निर्भरता नहीं है, और काफी अच्छी तरह से संरचित और प्रलेखित है, इसका मतलब संशोधित / पुन: उपयोग करना आसान है।

सभी 8 संभव अभिविन्यास संभालती है, और वादा आधारित है।

यहाँ आप जाते हैं, आशा है कि यह अभी भी किसी की मदद करता है: https://gist.github.com/vdavid/3f9b66b60f5220431717a4cc0e77097913


1

मैं मिश्रित समाधान (php + css) का उपयोग कर रहा हूं।

कंटेनर के लिए आवश्यक हैं:

  • div.imgCont2 कंटेनर को घुमाने की जरूरत;
  • div.imgCont1ज़ूम करने के लिए आवश्यक कंटेनर - width:150%;
  • div.imgCont स्क्रॉलबार्स के लिए कंटेनर की आवश्यकता होती है, जब छवि zoomOut होती है।

<?php
    $image_url = 'your image url.jpg';
    $exif = @exif_read_data($image_url,0,true);
    $orientation = @$exif['IFD0']['Orientation'];
?>

<style>
.imgCont{
    width:100%;
    overflow:auto;
}
.imgCont2[data-orientation="8"]{
    transform:rotate(270deg);
    margin:15% 0;
}
.imgCont2[data-orientation="6"]{
    transform:rotate(90deg);
    margin:15% 0;
}
.imgCont2[data-orientation="3"]{
    transform:rotate(180deg);
}
img{
    width:100%;
}
</style>

<div class="imgCont">
  <div class="imgCont1">
    <div class="imgCont2" data-orientation="<?php echo($orientation) ?>">
      <img src="<?php echo($image_url) ?>">
    </div>
  </div>
</div>

धन्यवाद, यह मेरी जरूरतों के लिए सबसे अच्छा समाधान की तरह लगता है। बाहरी पुस्तकालयों के लिए कोई ज़रूरत नहीं है और अनावश्यक कोड के लंबे ब्लॉक नहीं हैं। एक्सपी के साथ एक्सफ़ से अभिविन्यास निर्धारित करें, इसे दृश्य पर भेजें और सीएसएस कक्षाओं को ट्रिगर करने के लिए इसका उपयोग करें जो उचित संख्या में डिग्री को घुमाए। अच्छा और साफ! संपादित करें: यह ब्राउज़र में छवियों को घुमाएगा जो वास्तव में exif डेटा को पढ़ते हैं और तदनुसार घुमाते हैं। AKA यह डेस्कटॉप पर समस्या को ठीक करेगा लेकिन ios सफारी पर एक नया बनाता है।
cwal

0

@Feded namrouti के जवाब के अलावा,

यह प्रयोग किया जाना चाहिए यदि छवि को फ़ाइल इनपुट तत्व से ब्राउज किया जाना है

<input type="file" name="file" id="file-input"><br/>
image after transform: <br/>
<div id="container"></div>

<script>
    document.getElementById('file-input').onchange = function (e) {
        var image = e.target.files[0];
        window.loadImage(image, function (img) {
            if (img.type === "error") {
                console.log("couldn't load image:", img);
            } else {
                window.EXIF.getData(image, function () {
                    console.log("load image done!");
                    var orientation = window.EXIF.getTag(this, "Orientation");
                    var canvas = window.loadImage.scale(img,
                        {orientation: orientation || 0, canvas: true, maxWidth: 200});
                    document.getElementById("container").appendChild(canvas);
                    // or using jquery $("#container").append(canvas);
                });
            }
        });
    };
</script>

0

मैंने थोड़ी php स्क्रिप्ट लिखी है जो इमेज को घुमाती है। छवि को प्रत्येक अनुरोध के पुनर्गणना के पक्ष में संग्रहित करना सुनिश्चित करें।

<?php

header("Content-type: image/jpeg");
$img = 'IMG URL';

$exif = @exif_read_data($img,0,true);
$orientation = @$exif['IFD0']['Orientation'];
if($orientation == 7 || $orientation == 8) {
    $degrees = 90;
} elseif($orientation == 5 || $orientation == 6) {
    $degrees = 270;
} elseif($orientation == 3 || $orientation == 4) {
    $degrees = 180;
} else {
    $degrees = 0;
}
$rotate = imagerotate(imagecreatefromjpeg($img), $degrees, 0);
imagejpeg($rotate);
imagedestroy($rotate);

?>

चियर्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.