Son birkaç haftadır objektif-c'de resimlerle çalışıyorum ve birçok tuhaf davranışı fark ettim. Birincisi, diğer birçok insan gibi, ben de bu sorunu yaşıyorum, kamerayla çekilmiş (veya başka birinin kamerasıyla ve MMS ile çekilmiş) 90 derece döndürülüyor. Dünyada bunun neden olduğundan emin değildim (dolayısıyla sorum ) ama etrafta ucuz bir iş bulabildim.
Bu sefer sorum şu , bu neden oluyor ? Apple görüntüleri neden döndürüyor? Kameramla bir fotoğraf çektiğimde, yukarıda bahsedilen kodumu yapmazsam, fotoğrafı kaydettiğimde döndürülerek kaydedilir. Şimdi, çözümüm birkaç gün öncesine kadar iyiydi.
Uygulamam, bir görüntünün tek tek piksellerini, özellikle de bir PNG'nin alfa kanalını değiştirir (bu nedenle, herhangi bir JPEG dönüşümü senaryom için pencereden atılır). Birkaç gün önce, geçici çözüm kodum sayesinde görüntünün uygulamamda düzgün görüntülenmesine rağmen, algoritmam görüntünün tek tek piksellerini değiştirdiğinde görüntünün döndürüldüğünü düşündüğünü fark ettim. Yani görüntünün üstündeki pikselleri değiştirmek yerine görüntünün yanındaki pikselleri değiştirir (çünkü döndürülmesi gerektiğini düşünür)! Hafızadaki görüntünün nasıl döndürüleceğini çözemiyorum - ideal olarak bu imageOrientation
bayrağı hep birlikte silmeyi tercih ederim .
İşte beni şaşırtan başka bir şey daha ... Fotoğrafı çektiğimde imageOrientation
3'e ayarlandı. Geçici çözüm kodum bunu anlayacak ve kullanıcının asla fark etmemesi için onu çevirecek kadar akıllı. Ek olarak, görüntüyü kitaplığa kaydetme kodum bunu fark eder, döndürür ve ardından kamera rulosunda düzgün görünmesi için kaydeder.
Bu kod şöyle görünüyor:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Bu yeni kaydedilmiş görüntüyü uygulamama yüklediğimde imageOrientation
, 0 - tam olarak görmek istediğim şeydir ve rotasyon geçici çözümümün çalıştırılmasına bile gerek yoktur (not: bir kamerayla çekilen görüntülerin aksine internetten görüntüler yüklerken , imageOrientation
her zaman 0'dır, mükemmel davranışla sonuçlanır). Bazı nedenlerden dolayı, kaydetme kodum bu imageOrientation
bayrağı siliyor gibi görünüyor . Kullanıcı bir fotoğraf çekip uygulamaya ekledikten hemen sonra bu kodu çalmayı ve imageOrientation'ı silmek için kullanmayı umuyordum, ancak işe yaramıyor gibi görünüyor. İle UIImageWriteToSavedPhotosAlbum
özel bir şey yapıyor imageOrientation
mu?
Bu problem için en iyi çözüm imageOrientation
, kullanıcı bir görüntüyü çekmeyi bitirir bitirmez havaya uçmak olur mu. Apple'ın rotasyon davranışının bir nedeni olduğunu varsayıyorum, değil mi? Birkaç kişi bunun bir Apple kusuru olduğunu öne sürdü.
(... henüz kaybolmadıysanız ... Not 2: Yatay bir fotoğraf çektiğimde, her şey tıpkı internetten çekilmiş fotoğraflar gibi mükemmel çalışıyor gibi görünüyor)
DÜZENLE:
İşte bazı görüntüler ve senaryolar gerçekte neye benziyor. Şimdiye kadar yapılan yorumlara dayanarak, bu garip davranış, iyi olduğunu düşündüğüm bir iPhone davranışından daha fazlası gibi görünüyor.
Bu, telefonumla çektiğim fotoğrafın bir resmidir (doğru yönlendirmeye dikkat edin), tam olarak telefonumda fotoğrafı çektiğimde olduğu gibi görünüyor:
Resim, kendime e-postayla gönderdikten sonra Gmail’de şöyle görünüyor (Gmail bunu düzgün bir şekilde ele alıyor gibi görünüyor):
Görüntü, pencerelerde küçük resim olarak şöyle görünür (düzgün işlenmiş gibi görünmüyor):
Ve işte gerçek görüntünün Windows Fotoğraf Görüntüleyicisi ile açıldığında nasıl göründüğü (hala düzgün bir şekilde kullanılmıyor):
Bu soruya yapılan tüm yorumlardan sonra şunu düşünüyorum ... iPhone bir görüntü alıyor ve "Bunu düzgün görüntüleyebilmek için 90 derece döndürülmesi gerekiyor" diyor. Bu bilgi EXIF verilerinde olacaktır. (Düz düşey varsayılana dönmek yerine neden 90 derece döndürülmesi gerektiğini bilmiyorum). Buradan Gmail, EXIF verilerini okuyup analiz edecek ve düzgün bir şekilde görüntüleyecek kadar akıllıdır. Ancak Windows, EXIF verilerini okuyacak kadar akıllı değildir ve bu nedenle görüntüyü yanlış görüntüler . Varsayımlarım doğru mu?