In den letzten Wochen habe ich mit Bildern in Ziel-C gearbeitet und viele seltsame Verhaltensweisen bemerkt. Erstens hatte ich, wie viele andere Menschen, dieses Problem, bei dem Bilder, die mit der Kamera (oder mit der Kamera eines anderen und MMS für mich) aufgenommen wurden, um 90 Grad gedreht wurden. Ich war mir nicht sicher, warum in aller Welt dies geschah (daher meine Frage ), aber ich konnte mir eine billige Lösung ausdenken.
Meine Frage ist diesmal, warum das passiert . Warum dreht Apple Bilder? Wenn ich ein Foto mit der Kamera mit der rechten Seite nach oben aufnehme, wird das Foto beim Speichern gedreht, sofern ich meinen oben genannten Code nicht ausführe. Jetzt war meine Problemumgehung bis vor ein paar Tagen in Ordnung.
Meine Anwendung ändert einzelne Pixel eines Bildes, insbesondere den Alphakanal eines PNG (sodass jede JPEG-Konvertierung für mein Szenario aus dem Fenster geworfen wird). Vor ein paar Tagen habe ich festgestellt, dass das Bild, obwohl es dank meines Workaround-Codes in meiner App korrekt angezeigt wird, beim Ändern der einzelnen Pixel des Bildes denkt, dass das Bild gedreht wird. Anstatt also die Pixel oben im Bild 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 das Bild im Speicher gedreht werden soll - idealerweise würde ich es vorziehen, diese imageOrientation
Flagge alle zusammen wegzuwischen .
Hier ist noch etwas, das mich ebenfalls verblüfft hat ... Wenn ich das Foto mache, imageOrientation
ist das auf 3 gesetzt. Mein Workaround-Code ist klug genug, um dies zu erkennen und umzudrehen, damit der Benutzer es nie bemerkt. Zusätzlich mein Code , um das Bild in die Bibliothek speichern realisiert dies, dreht sie, dann speichert sie , damit es richtig in der Kamera Rolle erscheint.
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, imageOrientation
ist dies 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 , das imageOrientation
ist immer 0, was zu einem perfekten Verhalten). Aus irgendeinem Grund scheint mein Speichercode diese imageOrientation
Flagge zu löschen . Ich hatte gehofft, diesen Code einfach zu stehlen und damit meine imageOrientation zu löschen, sobald der Benutzer ein Foto macht und es der App hinzufügt, aber es scheint nicht zu funktionieren. Macht UIImageWriteToSavedPhotosAlbum
etwas Besonderes mit imageOrientation
?
Die beste Lösung für dieses Problem wäre, einfach wegzublasen, imageOrientation
sobald der Benutzer ein Bild aufgenommen hat. Ich gehe davon aus, dass Apple das Rotationsverhalten aus einem bestimmten Grund durchgeführt hat, 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. Basierend auf 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 (beachten Sie 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 mir per E-Mail gesendet habe (es sieht so aus, als würde Google Mail es richtig handhaben):
So sieht das Bild als Miniaturansicht in Windows aus (sieht nicht so aus, als würde es richtig behandelt):
Und so sieht das eigentliche Bild aus, wenn es mit Windows Photo Viewer geöffnet wird (immer noch nicht richtig gehandhabt):
Nach all den Kommentaren zu dieser Frage denke ich Folgendes: Das iPhone nimmt ein Bild auf und sagt: "Um dies richtig anzuzeigen, muss es um 90 Grad gedreht werden." Diese Informationen wären in den EXIF-Daten enthalten. (Warum es um 90 Grad gedreht werden muss, anstatt standardmäßig gerade vertikal zu sein, weiß ich nicht). Von hier aus ist Google Mail intelligent genug, um diese EXIF-Daten zu lesen, zu analysieren und ordnungsgemäß anzuzeigen. Windows ist jedoch nicht intelligent genug, um die EXIF-Daten zu lesen, und zeigt das Bild daher nicht ordnungsgemäß an . Sind meine Annahmen richtig?