Die iOS-Bildorientierung weist ein seltsames Verhalten auf

In den letzten Wochen habe ich mit Bildern in Objective-C gearbeitet und viel seltsames Verhalten bemerkt. Erstens habe ich, wie viele andere Menschen, dieses Problem, bei dem mit der Kamera aufgenommene Bilder (oder Bilder, die mit der Kamera einer anderen Person aufgenommen und mir per MMS gesendet wurden) um 90 Grad gedreht wurden. Ich war mir nicht sicher, warum in aller Welt dies geschahmeine Frage), aber ich konnte mir eine billige Lösung einfallen lassen.

Meine Frage ist diesmalWarum passiert dies? Warum dreht Apple Bilder? Wenn ich ein Foto mit der Kamera richtig herum aufnehme, wird es beim Speichern des Fotos gedreht gespeichert, sofern ich nicht den oben genannten Code ausführe. Jetzt war meine Problemumgehung bis vor ein paar Tagen in Ordnung.

Meine Anwendung ändert einzelne Pixel eines Bildes, insbesondere den Alpha-Kanal eines PNG (so dass jede JPEG-Konvertierung für mein Szenario aus dem Fenster geworfen wird). Vor ein paar Tagen habe ich festgestellt, dass das Bild, obwohl es in meiner App dank meines Workaround-Codes korrekt angezeigt wird, bei der Änderung der einzelnen Pixel des Bildes durch meinen Algorithmus als gedreht empfunden wird. Anstatt also die Pixel am oberen Rand des Bildes zu ändern, werden die Pixel an der Seite des Bildes geändert (weil es der Meinung ist, dass es gedreht werden sollte)! Ich kann nicht herausfinden, wie ich das Bild im Speicher drehen soll. Idealerweise würde ich es vorziehen, das Bild einfach wegzuwischenimageOrientation alle zusammen kennzeichnen.

Hier ist noch etwas, was mich ebenfalls verblüfft hat ... Wenn ich das Foto mache, ist dasimageOrientation ist auf 3 gesetzt. Mein Workaround-Code ist intelligent genug, um dies zu erkennen und zu spiegeln, damit der Benutzer es nie bemerkt. Darüber hinaus erkennt mein Code zum Speichern des Bildes in der Bibliothek dies, spiegelt es,dann speichert es so, dass es richtig in der Kamerarolle angezeigt wird.

Dieser Code sieht so aus:

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

Wenn ich dieses neu gespeicherte Bild in meine App lade, wird dieimageOrientation ist 0 - genau das, was ich sehen möchte, und meine Rotationsumgehung muss nicht einmal ausgeführt werden (Hinweis: Beim Laden von Bildern aus dem Internet im Gegensatz zu Bildern, die mit einer Kamera aufgenommen wurden, muss dieimageOrientation ist immer 0, was zu einem perfekten Verhalten führt). Aus irgendeinem Grund scheint mein Speichercode dies zu beseitigenimageOrientation Flagge. Ich hatte gehofft, nur diesen Code zu stehlen und damit meine imageOrientation zu löschen, sobald der Benutzer ein Foto macht und es zur App hinzugefügt hat, aber es scheint nicht zu funktionieren. TutUIImageWriteToSavedPhotosAlbum mach was besonderes mitimageOrientation?

Wäre die beste Lösung für dieses Problem, einfach wegzublasenimageOrientation sobald der Benutzer fertig ist, ein Bild aufzunehmen. Ich nehme an, Apple hat das Rotationsverhalten aus einem bestimmten Grund durchgeführt, oder? Einige Leute schlugen vor, dass dies ein Apple-Defekt ist.

(... wenn Sie noch nicht verloren sind ... Hinweis 2: Wenn ich ein horizontales Foto mache, scheint alles perfekt zu funktionieren, genau wie Fotos aus dem Internet.)

BEARBEITEN:

Hier sehen Sie, wie einige der Bilder und Szenarien tatsächlich aussehen. Ausgehend von den bisherigen Kommentaren sieht es so aus, als ob dieses seltsame Verhalten mehr als nur ein iPhone-Verhalten ist, was ich für gut halte.

Dies ist ein Bild des Fotos, das ich mit meinem Telefon aufgenommen habe (achten Sie auf die richtige Ausrichtung). Es wird genauso angezeigt wie auf meinem Telefon, als ich das Foto aufgenommen habe:

So sieht das Bild in Google Mail aus, nachdem ich es per E-Mail an mich selbst gesendet habe (es sieht so aus, als würde Google Mail es ordnungsgemäß verarbeiten):

So sieht das Bild in Windows als Miniaturansicht aus (sieht nicht so aus, als würde es richtig gehandhabt):

Und so sieht das eigentliche Bild aus, wenn es mit Windows Photo Viewer geöffnet wird (wird immer noch nicht richtig behandelt):

Nach all den Kommentaren zu dieser Frage ist hier, was ich denke ... Das iPhone nimmt ein Bild auf und sagt: "Um dies richtig anzuzeigen, muss es um 90 Grad gedreht werden". Diese Informationen befinden sich in den EXIF-Daten. (Ich weiß nicht, warum es um 90 Grad gedreht werden muss, anstatt standardmäßig auf gerade Vertikale zu setzen). Von hier aus ist Google Mail intelligent genug, um diese EXIF-Daten zu lesen, zu analysieren und ordnungsgemäß anzuzeigen. Windows ist jedoch nicht schlau genug, um die EXIF-Daten zu lesen, und zeigt daher das Bild anunsachgemäß. Sind meine Annahmen richtig?

Antworten auf die Frage(12)

Ihre Antwort auf die Frage