Przez ostatnie kilka tygodni pracowałem z obrazami w obiektyw-c i zauważyłem wiele dziwnych zachowań. Po pierwsze, podobnie jak wiele innych osób, mam problem polegający na tym, że zdjęcia zrobione aparatem (lub zrobione innym aparatem i wysłane do mnie w wiadomości MMS) są obrócone o 90 stopni. Nie byłem pewien, dlaczego tak się dzieje na świecie (stąd moje pytanie ), ale udało mi się wymyślić tanią pracę.
Moje pytanie tym razem brzmi: dlaczego tak się dzieje ? Dlaczego Apple obraca obrazy? Kiedy robię zdjęcie aparatem prawą stroną do góry, o ile nie wykonuję powyższego kodu, kiedy zapisuję zdjęcie, zostaje ono zapisane jako obrócone. Aż do kilku dni temu moje obejście było w porządku.
Moja aplikacja modyfikuje poszczególne piksele obrazu, w szczególności kanał alfa pliku PNG (więc każda konwersja JPEG jest wyrzucana z okna w moim scenariuszu). Kilka dni temu zauważyłem, że chociaż obraz jest wyświetlany poprawnie w mojej aplikacji dzięki kodowi obejścia, kiedy mój algorytm modyfikuje poszczególne piksele obrazu, uważa, że obraz jest obrócony. Więc zamiast modyfikować piksele na górze obrazu, modyfikuje piksele z boku obrazu (ponieważ uważa, że powinien być obrócony)! Nie potrafię wymyślić, jak obrócić obraz w pamięci - najlepiej byłoby, gdybyśmy po prostu usunęli tę imageOrientationflagę razem.
Jest jeszcze coś, co mnie zaskoczyło ... Kiedy robię zdjęcie, imageOrientationjest ustawiony na 3. Mój kod obejścia jest wystarczająco inteligentny, aby to zrealizować i odwrócić go, aby użytkownik nigdy tego nie zauważył. Dodatkowo mój kod zapisujący obraz w bibliotece zdaje sobie z tego sprawę, odwraca go, a następnie zapisuje, aby był prawidłowo wyświetlany w 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, imageOrientationjest 0 - dokładnie to, co chcę zobaczyć, a moje obejście nie musi nawet uruchamiać (uwaga: podczas ładowania obrazów z Internetu w przeciwieństwie do zdjęć zrobionych aparatem , imageOrientationzawsze wynosi 0, co daje doskonałe zachowanie). Z jakiegoś powodu mój kod zapisu wydaje się usuwać tę imageOrientationflagę. Miałem nadzieję, że po prostu wykradnę ten kod i użyję go do usunięcia mojej orientacji obrazu, gdy tylko użytkownik zrobi zdjęcie i doda je do aplikacji, ale wydaje się, że nie działa. Robi UIImageWriteToSavedPhotosAlbumcoś specjalnego imageOrientation?
Najlepszym rozwiązaniem tego problemu byłoby po prostu zdmuchnięcie, imageOrientationgdy tylko użytkownik skończy robić zdjęcie. Zakładam, że Apple ma jakieś zachowanie związane z rotacją, prawda? Kilka osób zasugerowało, że to wada Apple.
(... jeśli jeszcze się nie zgubiłeś ... Uwaga 2: Kiedy robię poziome zdjęcie, wszystko wydaje się działać idealnie, tak jak zdjęcia zrobione z internetu)
EDYTOWAĆ:
Oto, jak faktycznie wyglądają niektóre obrazy i scenariusze. Na podstawie dotychczasowych komentarzy 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, które zrobiłem telefonem (zwróć uwagę na właściwą orientację), wygląda dokładnie tak, jak na moim telefonie, kiedy zrobiłem zdjęcie:

Oto, jak wygląda obraz w Gmailu po wysłaniu go do siebie e-mailem (wygląda na to, że Gmail obsługuje go poprawnie):

Oto jak obraz wygląda jako miniatura w oknach (nie wygląda na to, że jest prawidłowo obsługiwany):

A oto, jak wygląda rzeczywisty obraz po otwarciu za pomocą przeglądarki fotografii systemu Windows (nadal nie jest obsługiwany prawidłowo):

Po wszystkich komentarzach do tego pytania, oto, co myślę ... iPhone robi zdjęcie i mówi „aby wyświetlić go poprawnie, należy go obrócić o 90 stopni”. Ta informacja byłaby w danych EXIF. (Dlaczego należy go obrócić o 90 stopni, zamiast domyślnie ustawiać go na prostą pionową, nie wiem). Stąd Gmail jest wystarczająco inteligentny, aby odczytywać i analizować dane EXIF oraz prawidłowo je wyświetlać. Jednak system Windows nie jest wystarczająco inteligentny, aby odczytać dane EXIF, a zatem wyświetla obraz nieprawidłowo . Czy moje przypuszczenia są prawidłowe?