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?
quelle
Antworten:
Ich habe F & E durchgeführt und festgestellt, dass jede Bilddatei Metadateneigenschaften hat. Wenn die Metadaten die Ausrichtung des Bildes angeben, die von anderen Betriebssystemen als Mac im Allgemeinen ignoriert wird. Bei den meisten aufgenommenen Bildern ist die Metadateneigenschaft auf den rechten Winkel eingestellt. Mac zeigt es also um 90 Grad gedreht. Sie können dasselbe Bild unter Windows ordnungsgemäß anzeigen.
Weitere Informationen finden Sie in dieser Antwort unter http://graphicssoft.about.com/od/digitalphotography/f/sideways-pictures.htm
Lesen Sie das Exif Ihres Bildes hier http://www.exifviewer.org/ oder http://regex.info/exif.cgi oder http://www.addictivetips.com/internet-tips/view-complete-exif -metadata-information-of-any-jpeg-image-online /
quelle
Ich hatte das gleiche Problem, als ich das Bild von der Kamera erhielt. Ich habe den folgenden Code eingegeben, um es zu beheben. Die Methode scaleAndRotateImage wurde von hier hinzugefügt
quelle
Schnelles Kopieren / Einfügen Schnelle Übersetzung von Dilips hervorragender Antwort .
quelle
Die Antwort darauf ist sehr einfach. Apple dreht das Bild NICHT. Hier liegt die Verwirrung.
Die CCD-Kamera dreht sich nicht und nimmt das Foto daher immer im Querformat auf.
Apple hat eine sehr clevere Sache gemacht - anstatt die ganze Zeit damit zu verbringen, das Bild zu drehen - Megabyte an Daten zu mischen - kennzeichnen Sie es einfach mit WIE das Bild aufgenommen wurde.
OpenGL macht Übersetzungen sehr einfach - so dass die DATEN nie gemischt werden - nur wie sie gezeichnet werden.
Daher die Orientierungs-Metadaten.
Dies wird zu einem Problem, wenn Sie zuschneiden, die Größe ändern usw. möchten. Sobald Sie jedoch wissen, was passiert, definieren Sie einfach Ihre Matrix und alles funktioniert.
quelle
Swift 4-Version mit Sicherheitsüberprüfungen der Antwort von Dilip .
quelle
(bounds.size.height, bounds.size.width) = (bounds.size.width, bounds.size.height)
Erstellen einer Variablen als Speicher verzichten.bounds.size.height.round()
undbounds.size.width.round()
Jedes vom iPhone / iPad erzeugte Bild wird als Querformat links mit dem Tag EXIF-Ausrichtung (Exif.Image.Orientation) gespeichert, das die tatsächliche Ausrichtung angibt.
Es hat die folgenden Werte: 1: Querformat links 6: Hochformat Normal 3: Querformat rechts 4: Hochformat verkehrt herum
In IOS werden die EXIF-Informationen ordnungsgemäß gelesen und die Bilder werden auf die gleiche Weise angezeigt, wie sie aufgenommen wurden. In Windows werden die EXIF-Informationen jedoch NICHT verwendet.
Wenn Sie eines dieser Bilder in GIMP öffnen, wird angezeigt, dass das Bild Rotationsinformationen enthält.
quelle
Für alle anderen, die Xamarin verwenden, ist hier eine C # -Übersetzung von Dilips großartiger Antwort und ein Dank an thattyson für die Swift-Übersetzung .
quelle
Ich bin auf diese Frage gestoßen, weil ich ein ähnliches Problem hatte, aber Swift benutzte. Ich wollte nur auf die Antwort verweisen, die für andere Swift-Entwickler bei mir funktioniert hat: https://stackoverflow.com/a/26676578/3904581
Hier ist ein Swift-Snippet, das das Problem effizient behebt:
Super einfach. Eine Codezeile. Problem gelöst.
quelle
Ich weiß genau, was dein Problem ist. Sie verwenden UIImagePicker, was in jeder Hinsicht seltsam ist. Ich würde vorschlagen, dass Sie AVFoundation für die Kamera verwenden, was Flexibilität in Bezug auf Ausrichtung und Qualität bietet. Verwenden Sie AVCaptureSession. Den Code erhalten Sie hier. Wie speichere ich mit AVFoundation aufgenommene Fotos im Fotoalbum?
quelle
Schnell überarbeitet für Swift 3 (kann jemand es testen und bestätigen, dass alles in Ordnung ist?):
quelle
Hier ist die Swift3-Version von Dilips großartiger Antwort
quelle
Versuchen Sie, das Bildformat in .jpeg zu ändern. Das hat bei mir funktioniert
quelle