MFMailComposeViewController die Ausrichtung der Bilder
Entwickle ich eine Universal-app und ich bin der Codierung für iOS6.
Ich bin mit dem imagePickerController um ein Foto zu machen und dann sende ich es als Anhang mit MFMailComposeViewController. Alle, die arbeiten.
Mein problem ist, dass wenn ich schieße ein Bild im portrait-Modus, ist es angezeigt, indem die MFMailComposeViewController im landscape-Modus. Auch, wenn es ankommt am Ziel-E-Mail-Adresse, ist es angezeigt, im landscape-Modus.
Wenn ich Schießen das Bild im landscape-Modus, es wird von der MFMailComposeViewController im landscape-Modus und wenn es ankommt am Ziel-E-Mail-Adresse, ist es angezeigt, im landscape-Modus. Also das ist alles OK.
Ich habe das gleiche Problem auf beiden meiner Geräte testen; ein iPhone5 und ein iPad2.
Wie kann ich ein Bild im Porträt-Modus gelangen Sie an die E-Mail-Ziel im portrait-Modus?
Hier ist, wie ich hinzufügen das Bild, um die E-Mail:
if ( [MFMailComposeViewController canSendMail] )
{
MFMailComposeViewController * mailVC = [MFMailComposeViewController new];
NSArray * aAddr = [NSArray arrayWithObjects: gAddr, nil];
NSData * imageAsNSData = UIImagePNGRepresentation( gImag );
[mailVC setMailComposeDelegate: self];
[mailVC setToRecipients: aAddr];
[mailVC setSubject: gSubj];
[mailVC addAttachmentData: imageAsNSData
mimeType: @"image/png"
fileName: @"myPhoto.png"];
[mailVC setMessageBody: @"Blah blah"
isHTML: NO];
[self presentViewController: mailVC
animated: YES
completion: nil];
}
else
{
NSLog( @"Device is unable to send email in its current state." );
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich damit verbracht, eine Anzahl von Stunden arbeiten zu diesem Thema, und ich bin mir jetzt klar darüber, was Los ist und wie es zu lösen ist.
Wiederholen, das problem, das ich gestoßen bin, ist:
Wenn ich Aufnahmen von Bildern im hochformat auf der Kamera mit der imagePickerController und übergeben Sie das Bild, um die MFMailComposeViewController und per e-mail, kommt es bei der Ziel-E-Mail-Adresse und angezeigt wird es fälschlicherweise im landscape-Modus.
Jedoch wenn ich Schießen das Bild im landscape-Modus und senden Sie es dann, ist es angezeigt, an die E-mail-Ziel, richtig in landscape-Modus
So, wie kann ich ein Bild im Porträt-Modus gelangen Sie an die E-Mail-Ziel im portrait-Modus? Das war meine ursprüngliche Frage.
Hier ist der code, wie ich zeigte es in der ursprünglichen Frage, mit der Ausnahme, dass ich jetzt senden das Bild als JPEG, sondern als PNG-aber das hat keinen Unterschied gemacht.
Dies ist, wie ich fange das Bild mit der imagePickerController und legen Sie Sie in eine Globale genannt gImag:
Und dies ist, wie ich E-Mail mit dem MFMailComposeViewController:
Wenn ich beschreiben, wie dieses Problem zu lösen, werde ich den Fokus auf die Zusammenarbeit mit einem iPhone 5 und mit seiner Haupt-Kamera, die schießt bei 3264x2448 nur um Dinge einfach zu halten. Dieses problem hat jedoch Auswirkungen auf andere Geräte und Auflösungen.
Der Schlüssel zur Erschließung dieses problem ist zu erkennen, dass, wenn Sie ein Bild aufnehmen, entweder im portrait der Landschaft, das iPhone speichert immer die UIImage auf die gleiche Weise: als 3264 breit und 2448 hoch.
Einem UIImage hat eine Eigenschaft, die beschreibt, seine Orientierung an der Zeit das Foto aufgenommen wurde, und Sie können es wie folgt:
Beachten Sie, dass die orientation-Eigenschaft hat nicht beschreiben, wie die Daten in der UIImage physisch konfiguriert (wie 3264w x 2448h); es beschreibt lediglich seine Orientierung an der Zeit das Bild aufgenommen wurde.
Eigentum ist zu sagen, die software, die etwa um das Bild anzuzeigen, wie zu drehen, also es wird korrekt angezeigt.
Wenn Sie eine Aufnahme im hochformat, Bild.Bildausrichtung zurück UIImageOrientationRight. Das sagt die Anzeige-software, die es braucht, um das Bild zu drehen 90 Grad, so daß es korrekt angezeigt wird. Klar sein, dass diese "rotation" hat keinen Einfluss auf die zugrunde liegende Lagerung von UIImage, das bleibt als 3264w x 2448h.
Wenn Sie eine Aufnahme im landscape-Modus, Bild.Bildausrichtung zurück UIImageOrientationUp. UIImageOrientationUp sagt die Anzeige-software, das Bild ist in Ordnung, um anzuzeigen, wie Sie ist; keine rotation erforderlich ist. Wieder, die zugrunde liegende Lagerung der UIIMage ist 3264w x 2448h.
Sobald Sie sich im klaren über den Unterschied zwischen dem, wie die Daten physisch gespeichert sind, vs., wie die orientation-Eigenschaft wird verwendet, um zu beschreiben, seine Orientierung an der Zeit es aufgenommen wurde, beginnen sich die Dinge klarer.
Erstellte ich ein paar Zeilen von debugging-code zu "sehen" alles.
Hier ist die imagePickerController code wieder mit der debugging-code Hinzugefügt:
Wenn wir fotografieren portrait, gImage kommt mit UIImageOrientationRight und Breite = 3264 und Höhe = 2448.
Wenn wir Schießen, Landschaft, gImage kommt mit UIImageOrientationUp und Breite = 3264 und Höhe = 2448.
Wenn wir weiter auf der E-Mailng MFMailComposeViewController code, ich habe den debugging-code gab es auch:
Nichts erstaunlich, zu sehen hier. Wir bekommen genau die gleichen Werte wie wir damals in der imagePickerController code.
Mal sehen, wie genau sich das problem äußert:
Beginnen, nimmt die Kamera ein hochformat gedreht und es wird korrekt angezeigt, im portrait-Modus, indem Sie die Zeile:
Wird es korrekt angezeigt, da diese Codezeile sieht, die Eigenschaft Ausrichtung und dreht das Bild entsprechend (während NICHT berühren die zugrunde liegende Lagerung bei 3264x2448).
Flow-of-control geht an die E-Mailer-code jetzt und die orientation-Eigenschaft ist noch heute in gImag so, wenn die MFMailComposeViewController code zeigt das Bild in der ausgehende E-Mail ist es korrekt ausgerichtet ist. Das physikalische Bild ist noch gespeichert, als 3264x2448.
Die E-Mail gesendet und auf der Empfangsseite, die Kenntnis der orientation-Eigenschaft verloren gegangen ist, so dass die empfangende software zeigt das Bild wie es ist physikalisch so angeordnet, wie 3264x2448, d.h. Landschaft.
Debuggen, ich lief in eine zusätzliche Verwirrung. Und das ist, dass die orientation-Eigenschaft entfernt werden können, von UIImage, wenn Sie eine Kopie machen es falsch.
Dieser code zeigt das problem:
Wenn wir uns auf die debugging-Daten für die neue UIImage tmp, wir bekommen UIImageOrientationUp und Breite = 3264 und Höhe = 2448.
Die orientation-Eigenschaft wurde entfernt und die Standard-Ausrichtung ist. Wenn Sie nicht wissen, die Strippen Los ist, es kann wirklich verwirren alles.
Wenn ich diesen code ausführen, bekomme ich jetzt folgende Ergebnisse:
Dinge sind unverändert in die imagePickerController code; das Bild aufgenommen wird, als zuvor.
Flow-of-control geht auf den E-Mailer code aber jetzt ist die orientation-Eigenschaft wurde entfernt tmp-image, so dass, wenn die MFMailComposeViewController code zeigt die tmp-Bild in die ausgehende E-Mail wird Ihnen angezeigt, im landscape-Modus (weil die Standard-Ausrichtung ist UIImageOrientationUp es gibt also keine rotation durchgeführt der 3264x2448 Bild).
Die E-Mail gesendet und auf der Empfangsseite, die Kenntnis von der Eigenschaft "Ausrichtung" fehlt auch, so dass die empfangende software zeigt das Bild wie es ist physikalisch so angeordnet, wie 3264x2448, d.h. Landschaft.
Diese 'stripping' der orientation-Eigenschaft bei der Erstellung von Kopien der UIImage können vermieden werden, wenn man sich bewusst ist, es geht auf, indem Sie den folgenden code, um das UIImage kopieren:
Erlauben würde, dass Sie zu vermeiden, verlieren die Orientierung-Eigenschaft auf dem Weg, aber es würde immer noch nicht den Umgang mit seinen Verlust auf der Gegenseite, wenn Sie e-mail das Bild.
Es gibt einen besseren Weg, als dies alles über Unordnung und sich Gedanken über die orientation-Eigenschaft.
Fand ich einige code hier, dass ich integriert haben, ist in meinem Programm. Dieser code wird physisch drehen Sie den zugrunde liegenden gespeicherten Bildes entsprechend seiner Eigenschaft Ausrichtung.
Für ein UIImage mit einer Orientierung UIImageOrientationRight, es wird physisch drehen Sie das UIImage, so dass es endet als 2448x3264 und es wird Streifen entfernt die orientation-Eigenschaft, so dass es gesehen wird, die danach als Standard-UIImageOrientationUp.
Für ein UIImage mit einer Orientierung UIImageOrientationUp, es tut sich nix. Es ermöglicht die schlafende Landschaft Hunde liegen.
Wenn Sie dies tun, dann denke ich (basierend auf dem, was ich bisher gesehen habe), dass die orientation-Eigenschaft des UIImage ist überflüssig danach. So lange er noch fehlen/entfernt oder gesetzt UIImageOrientationUp, sollten Ihre Bilder werden korrekt angezeigt, bei jedem Schritt entlang der Weise-und am Fernen Ende, wenn die eingebettete Bilder in Ihrem E-Mail angezeigt wird.
Alles, was ich besprochen habe in der Antwort, die ich persönlich einzelschrittmodus und sah es passieren.
So, hier mein endgültiger code, der funktioniert:
und
Und, schließlich, hier ist der code, den ich packte aus hier, dass nicht die körperliche Drehung, wenn nötig:
Cheers aus Neuseeland.
Habe ich Schwierigkeiten mit dem Bild Ausrichtungen auf iOS SDK7 mein selbst, und ich will etwas hinzufügen, um diese Diskussion in der Hoffnung, es ist nützlich, um andere.
UIImageJPEGRepresentation
funktioniert gut, aber beachten Sie, dass die VerwendungUIImagePNGRepresentation
könnten, führen zu einem Bild mit falscher Ausrichtung.Bin ich, eine app zu entwickeln, bei dem ein Bild hochgeladen, nachdem mit dem Gerät Kamera. Ich nicht gespeichert und das Bild zeitlich auf die Festplatte, sondern senden Sie es direkt an den server.
Beim Rendern eines UIImage zu NSData, Sie können wählen zwischen
UIImagePNGRepresentation
undUIImageJPEGRepresentation
.Bei der Verwendung
UIImagePNGRepresentation
sowohl ein Bild im Porträt-und landscape-Orientierung Ergebnis in einem Landschaftsbild. In diesem Fall das hochformat-Bild ist um 90 Grad gedreht gegen den Uhrzeigersinn.Bei der Verwendung
UIImageJPEGRepresentation
sowohl hoch-und Querformat-Bild Folge mit einer korrekten Ausrichtung.swift version der Skala Teil:
Ich denke, dass kann man das UIImage-API zum behandeln der Drehung automatisch für Sie, ohne dass Sie manuell tun die Transformationen.
In der Dokumentation für das UIImage Methoden Größe und drawInRect: beide sagen, Sie nehmen die Orientierung berücksichtigt, so dass ich drawInRect die UIImage in einen neuen Kontext und greifen die daraus resultierende (selbst-gedrehte) Bild von dort. Hier ist der code in einer Kategorie:
Ich gerade gefunden das besser beantworten von an0, das ist praktisch das gleiche, beinhaltet aber auch die Optimierung von nicht re-Neuzeichnen das Bild, wenn die Ausrichtung korrekt ist.
Müssen Sie das Bild drehen, je nach Ihrer Ausrichtung. Hier ist ein trick wie man es leicht tun:
Falls jemand hier landet, und erfordert eine Rasche 4 Lösung:
Dann können Sie es wie folgt: