UIImagePickerController bug
Ich glaube ich habe einen bug im aktuellen iOS 7 durch ausführen einer app mit Basis-SDK setzen auf iOS 6.1 (evtl. auch niedrigere Versionen, getestet noch nicht, dass noch raus)
Habe ich dieses Bild in meinem Foto-Bibliothek: http://i.imgur.com/7KUIGLt.jpg
Präsentiere ich einen UIImagePickerController über:
UIImagePickerController *vc = [[UIImagePickerController alloc] init];
vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
vc.delegate = self;
vc.allowsEditing = YES;
[self presentViewController:vc animated:YES completion:nil];
Ich speichern das ausgewählte Bild zu meinem desktop (den ich bin mit dieser auf-simulator, aber das funktioniert auf dem Gerät auch)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage* outputImage = [info objectForKey:UIImagePickerControllerEditedImage];
if (outputImage == nil) {
outputImage = [info objectForKey:UIImagePickerControllerOriginalImage];
}
NSData *d = UIImagePNGRepresentation(outputImage);
[d writeToFile:@"/Users/Admin/Desktop/test.png" atomically:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}
Es ergibt sich das folgende Bild:
Beachten Sie die großen schwarzen Balken auf der rechten Seite. Was ist die Ursache?
Zu reproduzieren, die Sie benötigen:
- iOS 7
- App mit Basis-SDK Satz 6.1 (vielleicht sogar noch niedriger-SDKs, die auch ich noch nicht versucht)
- iPhone 5/5c/5s
- Geschieht nur Bilder wurden aufgenommen mit iPhone 5/5c/5s Kamera (Sie können das ursprüngliche Bild, das ich weiter oben verlinkt zum testen)
HINWEIS: Nur klar zu sein, der schwarze Balken ist Teil des eigentlichen Bildes. Das Bild, das Sie sehen, es gibt nicht einen screenshot von einem UIImageView, aber das eigentliche Bild auf der Festplatte gespeichert und hier hochgeladen...
- Naja deine Quelle eingestellt
UIImagePickerControllerSourceTypePhotoLibrary
, so dass es scheint, Sie sind nicht die eigentliche Kamera, aber die Abholung von Bildern aus der Bibliothek. Richtig ? - Ich habe gesehen, Probleme wie diese mit den bearbeiteten Bildern und/oder gedrehten Bildern. Tritt dies für Aufnahmen in anderen Orientierungen? Passiert, wenn Sie nicht zulassen, dass die Bearbeitung?
- Dies gelingt, wenn Sie die Bearbeitung rect? Eines dieser Probleme sahen wir nur geschehen, wenn der Benutzer akzeptiert die Standard-Ernte-rect.
- ja, es passiert nur, wenn die Bilder ausgewählt sind aus der Bibliothek. Wenn Sie ergriffen werden von der Kamera innerhalb der app, es funktioniert gut.
- Können Sie das klären? Was ist das Problem hier, ist der schwarze Balken soll es sein?
- Ich vermute, das hat etwas zu tun mit Metadaten-handling, speziell mit der Orientierung und Größe. Ein Teil der interne code kann denken, Orientierung, während andere kann nicht beim Umgang mit Bild-Größe.Ich kann es nicht überprüfen jetzt aber UIImage.Größe (iOS 5) Rückgabewert denen sich die Orientierung des Bildes, während CGImageGetWidth/Höhe nicht wäre. Da output image B und h gleich sind und der zusätzliche Balken ist schwarz, Ziel-Bild gewesen sein könnte, hergestellt aus original-Bild, das sich in calloc würde cgbitmapcontext mit falschen (ratio) Größe.Was passiert, wenn Sie speichern, um UIImageJPEGRepresentation?
- Nicht wirklich-Metadaten.. Die CropRect Werte sind falsch. Überprüfen Sie heraus die Antwort, die ich gerade Hinzugefügt. Schön finden 0xSina!
- Gut gemacht 0xSina -- dies ist eine klare und offensichtliche Apple-bug. Es ist wirklich überraschend, ich denke das ist DIE EINZIGE Frage auf das Thema.
- PS related stackoverflow.com/questions/4094533/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage "Was verursacht das?" Also ich werde mich darauf konzentrieren, anstatt einen workaround.
Dies ist definitiv ein bug in iOS 7 Umgang mit bearbeitete Bilder im unteren base SDKs. Wir können auch ausschließen, dass XCode 5 & Base SDK 6.1 verursacht dies, weil ich bin immer das gleiche Problem mit XCode 4.6.3 & 6.1 SDK mit iOS 7 Simulator.
Die Quelle des Problems ist, dass die CropRect Werte berechnet werden, die von der SDK sind falsch.
Wenn Sie dann drucken Sie die
info
NSDictionary
vonimagePickerController:didFinishPickingMediaWithInfo
du wirst sehen, dass:iOS 7 läuft, alle SDK-niedriger als 7, bekommen wir:
Während mit iOS 6 oder 5 mit Ihrer SDK geben uns:
Sind Sie wahrscheinlich zu sagen, hmm, das y-Werte ändern sich zwischen SDKs zu. Gut, ja, wenn Sie schieben Sie Ihr Bild ganz nach unten und wählen Sie es, bekommen Sie einen schwarzen Leiste am unteren Rand des Bildes.
Vorgeschlagenen Lösungen:
einen bug-report an Apple hier...Tat es!Nicht verwenden
UIImagePickerControllerEditedImage
und nehmen Sie das original-Bild statt.Berechnen und tun das zuschneiden Ihrer selbst.
Verwenden eine 3rd-party-cropping-Bibliothek wie PEPhotoCropEditor oder SSPhotoCropperViewController
Bearbeiten - sehr einfache-Lösung Hinzugefügt von fan von die Antwort!
Erstaunlich es sein kann, diese einfache und elegante beschneiden Sie es selbst:
Hier ist die ganze routine ordinaryCrop:toRect:
Nun als Jesse Punkte aus, ist es entscheidend, um das Bild zu drehen, richtig. Diese absolut unglaubliche Stück code, die von Anomie macht den job:
iOS UIImagePickerController Ergebnis die Ausrichtung der Bilder nach dem upload
Befestigung UIImage Orientierung .. UIImage+fixOrientation.h
So einfach ist das, hoffe es hilft jemandem. Nochmals vielen Dank für die wertvollen Antworten hier.
UIImagePickerControllerEditedImage
gibt das richtige Bild, obwohl Sie wissen müssen, um korrekte Ausrichtung, wenn es kommt von der Kamera. Auf iOS-11, der Fehler ist das zuschneiden Quadrat ist falsch positioniert, was zu einem Bildausschnitt, der Versatz nach unten, von wo die Benutzer dachten, Sie waren kupiert.Ich glaube, landeten wir arbeiten, um ähnliche Probleme, die von nie zu Fragen für das bearbeitete Bild direkt; Fragen Sie nach dem original-Bild und den crop-Informationen (
UIImagePickerControllerCropRect
) und nicht der ackerbau selbst. Beachten Sie, dass Sie brauchen, um über Rotationen in der Quelle ein Bild, wenn du die beschneiden sich selbst.Finden Sie vielleicht die Antwort in dieser Frage hilfreich für die Umsetzung dieser work-around.
Versuchen, finden und ändern-Modus (Aspect Fit, Seitenverhältnis Füllen, Skalieren) Füllen programmgesteuert.
Ich versuche den Fehler zu reproduzieren. Und haben kein Glück auf-simulator, simulator-und 64-bit iPad mini. Alle mit iOS 7.0.
Setze ich deinen code in meine app:
Und es funktioniert korrekt mit Bild heruntergeladen http://i.imgur.com/7KUIGLt.jpg.
Ich glaube, Sie haben Problem in Ihrem app nicht in UIImagePickerController.