Nelle ultime settimane ho lavorato con immagini in Object-C e ho notato molti comportamenti strani. Innanzitutto, come molte altre persone, ho riscontrato questo problema in cui le immagini scattate con la fotocamera (o scattate con la fotocamera di qualcun altro e l'MMS per me) vengono ruotate di 90 gradi. Non ero sicuro del motivo per cui nel mondo stesse accadendo (da qui la mia domanda ) ma sono stato in grado di trovare un lavoro economico in giro.
La mia domanda questa volta è: perché sta accadendo ? Perché Apple ruota le immagini? Quando scatto una foto con la fotocamera rivolta verso l'alto, a meno che non esegua il codice sopra menzionato, quando salvo la foto viene salvata ruotata. Ora, la mia soluzione alternativa andava bene fino a pochi giorni fa.
La mia applicazione modifica i singoli pixel di un'immagine, in particolare il canale alfa di un PNG (quindi qualsiasi conversione JPEG viene buttata fuori dalla finestra per il mio scenario). Qualche giorno fa ho notato che anche se l'immagine viene visualizzata correttamente nella mia app grazie al mio codice di soluzione alternativa, quando il mio algoritmo modifica i singoli pixel dell'immagine, pensa che l'immagine sia ruotata. Quindi, invece di modificare i pixel nella parte superiore dell'immagine, modifica i pixel sul lato dell'immagine (perché pensa che dovrebbe essere ruotato)! Non riesco a capire come ruotare l'immagine in memoria - idealmente preferirei semplicemente cancellare quella imageOrientationbandiera tutta insieme.
Ecco qualcos'altro che mi ha sconcertato ... Quando scatto la foto, imageOrientationè impostato su 3. Il mio codice di soluzione alternativa è abbastanza intelligente da rendersene conto e capovolgerlo in modo che l'utente non se ne accorga. Inoltre, il mio codice per salvare l'immagine nella libreria lo realizza, la capovolge, quindi la salva in modo che appaia correttamente nel rullino fotografico.
Quel codice sembra così:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Quando carico questa immagine appena salvata nella mia app, imageOrientationè 0, esattamente quello che voglio vedere e la mia soluzione alternativa di rotazione non deve nemmeno essere eseguita (nota: quando si caricano immagini da Internet rispetto alle immagini scattate con una fotocamera , imageOrientationè sempre 0, risultando in un comportamento perfetto). Per qualche motivo, il mio codice di salvataggio sembra cancellare questo imageOrientationflag. Speravo di rubare quel codice e usarlo per cancellare il mio ImageOrientation non appena l'utente scatta una foto e l'ha aggiunta all'app, ma non sembra funzionare. Fa UIImageWriteToSavedPhotosAlbumqualcosa di speciale con imageOrientation?
La soluzione migliore per questo problema sarebbe semplicemente spazzare via imageOrientationnon appena l'utente ha finito di scattare un'immagine. Presumo che Apple abbia eseguito il comportamento di rotazione per un motivo, giusto? Alcune persone hanno suggerito che si tratta di un difetto di Apple.
(... se non ti sei ancora perso ... Nota2: quando scatto una foto orizzontale, sembra che tutto funzioni perfettamente, proprio come le foto prese da Internet)
MODIFICARE:
Ecco come appaiono effettivamente alcune delle immagini e degli scenari. Sulla base dei commenti finora, sembra che questo strano comportamento sia più di un semplice comportamento di iPhone, che penso sia buono.
Questa è una foto della foto che ho scattato con il mio telefono (nota l'orientamento corretto), appare esattamente come sul mio telefono quando ho scattato la foto:

Ecco come appare l'immagine in Gmail dopo che l'ho inviata a me stesso (sembra che Gmail la gestisca correttamente):

Ecco come appare l'immagine come miniatura in Windows (non sembra che sia gestita correttamente):

Ed ecco come appare l'immagine reale quando viene aperta con Windows Photo Viewer (ancora non gestita correttamente):

Dopo tutti i commenti su questa domanda, ecco cosa sto pensando ... L'iPhone scatta un'immagine e dice "per visualizzarla correttamente, deve essere ruotata di 90 gradi". Questa informazione sarebbe nei dati EXIF. (Perché deve essere ruotato di 90 gradi, invece di essere impostato automaticamente in verticale, non lo so). Da qui, Gmail è abbastanza intelligente da leggere e analizzare i dati EXIF e visualizzarli correttamente. Windows, tuttavia, non è abbastanza intelligente da leggere i dati EXIF e quindi visualizza l'immagine in modo improprio . Le mie ipotesi sono corrette?