पिछले कुछ हफ्तों से मैं ऑब्जेक्टिव-सी में छवियों के साथ काम कर रहा हूं और बहुत सारे अजीब व्यवहार देख रहा हूं। सबसे पहले, कई अन्य लोगों की तरह, मुझे यह समस्या हो रही है कि कैमरे के साथ ली गई छवियां (या किसी और के कैमरे के साथ ली गई हैं और मेरे लिए MMS'd) 90 डिग्री घुमाए गए हैं। मुझे यकीन नहीं था कि दुनिया में ऐसा क्यों हो रहा था (इसलिए मेरा सवाल ) लेकिन मैं एक सस्ते काम के साथ आने में सक्षम था।
मेरा सवाल इस बार ऐसा क्यों हो रहा है ? Apple क्यों घूमती है छवियाँ? जब मैं अपने कैमरे को राइट-अप अप के साथ एक फोटो लेता हूं, जब तक कि मैं ऊपर उल्लिखित अपने कोड को निष्पादित नहीं करता, जब मैं फोटो को सहेजता हूं तो यह घुमाए जाने से बच जाता है। अब, मेरा वर्कअराउंड कुछ दिनों पहले तक ठीक था।
मेरा आवेदन एक छवि के अलग-अलग पिक्सल को संशोधित करता है, विशेष रूप से पीएनजी का अल्फा चैनल (इसलिए कोई भी जेपीईजी रूपांतरण मेरे परिदृश्य के लिए खिड़की से बाहर फेंक दिया जाता है)। कुछ दिन पहले मैंने देखा कि भले ही मेरे वर्कअराउंड कोड की बदौलत मेरे ऐप में इमेज ठीक से दिखाई दे रही हो, जब मेरा अल्गोरिदम इमेज के अलग-अलग पिक्सल को मॉडिफाई करता है, तो उसे लगता है कि इमेज रोटेट हो गई है। इसलिए छवि के शीर्ष पर पिक्सेल को संशोधित करने के बजाय, यह छवि के किनारे पिक्सेल को संशोधित करता है (क्योंकि यह सोचता है कि इसे घुमाया जाना चाहिए)! मैं यह पता नहीं लगा सकता कि छवि को स्मृति में कैसे घुमाया जाए - आदर्श रूप से मैं उस imageOrientation
ध्वज को सभी को एक साथ मिटा देना पसंद करूंगा ।
यहाँ कुछ और है जो मुझे भी चकित कर रहा है ... जब मैं फोटो लेता हूं, तो imageOrientation
3 पर सेट होता है। मेरा वर्कअराउंड कोड यह महसूस करने के लिए काफी स्मार्ट है और इसे फ्लिप करें ताकि उपयोगकर्ता कभी नोटिस न करे। इसके अतिरिक्त, लाइब्रेरी में छवि को सहेजने के लिए मेरा कोड यह महसूस करता है, इसे फ़्लिप करता है, फिर इसे सहेजता है ताकि यह कैमरा रोल में ठीक से दिखाई दे।
ऐसा कोड दिखता है:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
जब मैं इस नई सहेजी गई छवि को अपने ऐप में लोड करता हूं, तो imageOrientation
0 है - बिल्कुल वही जो मैं देखना चाहता हूं, और मेरे रोटेशन वर्कअराउंड को भी चलाने की आवश्यकता नहीं है (ध्यान दें: जब कैमरा से ली गई छवियों के विपरीत इंटरनेट से छवियों को लोड करना हो , imageOrientation
हमेशा 0 होता है, जिसके परिणामस्वरूप पूर्ण व्यवहार होता है)। किसी कारण से, मेरा कोड इस imageOrientation
ध्वज को मिटा देता है । मैं बस उस कोड को चोरी करने की उम्मीद कर रहा था और जैसे ही उपयोगकर्ता एक फोटो लेता है और इसे ऐप में जोड़ दिया है, मेरी छवि को मिटा देने के लिए इसका उपयोग करता है, लेकिन यह काम नहीं करता है। के UIImageWriteToSavedPhotosAlbum
साथ कुछ खास करता है imageOrientation
?
क्या इस समस्या के लिए सबसे अच्छा समाधान यह होगा कि imageOrientation
जैसे ही उपयोगकर्ता चित्र ले रहा है, वैसे ही उड़ जाएं । मुझे लगता है Apple एक कारण के लिए रोटेशन व्यवहार किया है, है ना? कुछ लोगों ने सुझाव दिया कि यह एक Apple दोष है।
(... यदि आप अभी तक खोए नहीं हैं ... नोट 2: जब मैं एक क्षैतिज तस्वीर लेता हूं, तो सब कुछ पूरी तरह से काम करने लगता है, जैसे इंटरनेट से ली गई तस्वीरें)
संपादित करें:
यहाँ कुछ चित्र और परिदृश्य वास्तव में दिखते हैं। अब तक की टिप्पणियों के आधार पर, ऐसा लगता है कि यह अजीब व्यवहार सिर्फ एक iPhone व्यवहार से अधिक है, जो मुझे लगता है कि अच्छा है।
यह उस तस्वीर का चित्र है जिसे मैंने अपने फोन के साथ लिया था (उचित अभिविन्यास पर ध्यान दें), यह बिल्कुल वैसा ही प्रतीत होता है जैसा कि मैंने अपने फोन पर किया था जब मैंने फोटो खींचा था:
जीमेल में छवि अपने आप को ईमेल करने के बाद क्या दिखती है (जैसा जीमेल इसे ठीक से हैंडल करता है):
यहाँ वही है जो छवि खिड़कियों में एक थंबनेल के रूप में दिखती है (ऐसा नहीं लगता कि इसे ठीक से संभाला गया है):
और यहां विंडोज फोटो व्यूअर के साथ खोले जाने पर वास्तविक चित्र जैसा दिखता है (अभी भी ठीक से नहीं संभाला गया है):
इस सवाल पर सभी टिप्पणियों के बाद, यहाँ मैं क्या सोच रहा हूँ ... iPhone एक छवि लेता है, और कहता है "इसे ठीक से प्रदर्शित करने के लिए, इसे 90 डिग्री घुमाया जाना चाहिए"। यह जानकारी EXIF डेटा में होगी। (यह सीधे ऊर्ध्वाधर के लिए डिफ़ॉल्ट होने के बजाय, 90 डिग्री घूमने की आवश्यकता क्यों है, मुझे नहीं पता)। यहां से, Gmail उस EXIF डेटा को पढ़ने और विश्लेषण करने के लिए काफी स्मार्ट है, और इसे ठीक से प्रदर्शित करता है। हालाँकि, Windows EXIF डेटा पढ़ने के लिए पर्याप्त स्मार्ट नहीं है, और इसलिए छवि को अनुचित तरीके से प्रदर्शित करता है । क्या मेरी धारणाएँ सही हैं?