Orientacja obrazu w systemie iOS ma dziwne zachowanie

Przez ostatnie kilka tygodni pracowałem nad obrazami w trybie obiektywnym i zauważyłem wiele dziwnych zachowań. Po pierwsze, podobnie jak wielu innych ludzi, mam ten problem, gdy obrazy zrobione aparatem (lub zrobione przez kogoś innego aparatem i MMSem do mnie) są obracane o 90 stopni. Nie byłem pewien, dlaczego tak się dzieje na świecie (stądmoje pytanie) ale udało mi się znaleźć tanią pracę.

Tym razem mam pytaniedlaczego to się dzieje? Dlaczego Apple obraca obrazy? Kiedy robię zdjęcie aparatem z prawej strony do góry, chyba że wykonam wspomniany powyżej kod, gdy zapisuję zdjęcie, zostaje ono zapisane w obrocie. Moje obejście było w porządku do kilku dni temu.

Moja aplikacja modyfikuje pojedyncze piksele obrazu, w szczególności kanał alfa PNG (tak więc każda konwersja JPEG jest wyrzucana przez okno dla mojego scenariusza). Kilka dni temu zauważyłem, że mimo że obraz jest wyświetlany poprawnie w mojej aplikacji dzięki kodowi obejścia, kiedy mój algorytm modyfikuje pojedyncze piksele obrazu, myśli, że obraz jest obracany. Zamiast modyfikować piksele na górze obrazu, modyfikuje piksele z boku obrazu (ponieważ uważa, że ​​powinien zostać obrócony)! Nie potrafię wymyślić, jak obracać obraz w pamięci - najlepiej byłbym po prostu go zetrzećimageOrientation flaga razem.

Oto coś jeszcze, co mnie zaskakuje ... Kiedy robię zdjęcie,imageOrientation jest ustawiony na 3. Mój kod obejścia jest wystarczająco inteligentny, aby to zrozumieć i przerzucić go, aby użytkownik nigdy nie zauważył. Dodatkowo mój kod zapisujący obraz do biblioteki uświadamia sobie to, odwraca go,następnie zapisuje go, aby prawidłowo wyświetlał się na rolce aparatu.

Ten kod wygląda tak:

NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap 
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];   
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

Kiedy ładuję ten nowo zapisany obraz do mojej aplikacji,imageOrientation jest 0 - dokładnie to, co chcę zobaczyć, a moje obejście nie wymaga nawet uruchomienia (uwaga: podczas ładowania obrazów z Internetu, w przeciwieństwie do obrazów wykonanych aparatem,imageOrientation jest zawsze 0, co powoduje doskonałe zachowanie). Z jakiegoś powodu mój kod składowania zdaje się to usuwaćimageOrientation flaga. Miałem nadzieję ukraść ten kod i użyć go do usunięcia mojego imageOrientation, gdy tylko użytkownik zrobi zdjęcie i doda je do aplikacji, ale nie działa. RobiUIImageWriteToSavedPhotosAlbum zrób coś specjalnegoimageOrientation?

Czy najlepszym rozwiązaniem tego problemu będzie po prostu zdmuchnięcieimageOrientation jak tylko użytkownik skończy robić zdjęcie. Zakładam, że Apple zachowuje rotację z jakiegoś powodu, prawda? Kilka osób zasugerowało, że jest to defekt Apple.

(... jeśli jeszcze nie zgubiłeś ... Uwaga2: Kiedy robię poziome zdjęcie, wszystko działa idealnie, tak jak zdjęcia zrobione z internetu)

EDYTOWAĆ:

Oto, jak wyglądają niektóre obrazy i scenariusze. Opierając się na dotychczasowych komentarzach, wygląda na to, że to dziwne zachowanie jest czymś więcej niż tylko zachowaniem iPhone'a, co moim zdaniem jest dobre.

To jest zdjęcie zdjęcia zrobionego telefonem (zwróć uwagę na właściwą orientację), wygląda ono dokładnie tak samo jak na moim telefonie, gdy zrobiłem zdjęcie:

Oto jak wygląda obraz w Gmailu po wysłaniu go do mnie pocztą e-mail (wygląda na to, że Gmail obsługuje go prawidłowo):

Oto, jak obraz wygląda jak miniaturka w oknach (nie wygląda na to, że jest poprawnie obsługiwany):

Oto jak wygląda rzeczywisty obraz po otwarciu w przeglądarce zdjęć systemu Windows (nadal nie obsługiwanej prawidłowo):

Po wszystkich komentarzach do tego pytania oto, o czym myślę ... iPhone robi zdjęcie i mówi: „aby wyświetlać to poprawnie, musi być obrócony o 90 stopni”. Informacje te byłyby w danych EXIF. (Dlaczego trzeba go obrócić o 90 stopni, zamiast domyślnego ustawienia pionowego, nie wiem). Od tego momentu Gmail jest wystarczająco inteligentny, aby czytać i analizować dane EXIF ​​i prawidłowo je wyświetlać. System Windows nie jest jednak wystarczająco inteligentny, aby odczytać dane EXIF, dlatego wyświetla obrazniewłaściwie. Czy moje założenia są prawidłowe?

questionAnswers(11)

yourAnswerToTheQuestion