UIImagePickerController error

Creo que encontré un error en el último iOS 7 ejecutando una aplicación con Base SDK configurada para iOS 6.1 (posiblemente incluso versiones más bajas también, aún no lo he probado)

Tengo esta image en mi biblioteca de fotos: http://i.imgur.com/7KUIGLt.jpg

Presento un UIImagePickerController a través de:

UIImagePickerController *vc = [[UIImagePickerController alloc] init]; vc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; vc.delegate = self; vc.allowsEditing = YES; [self presentViewController:vc animated:YES completion:nil]; 

Guardo la image elegida en mi escritorio (estoy ejecutando esto en el simulador, pero esto también funciona en el dispositivo)

 - (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]; } 

Esta es la image resultante: introduzca la descripción de la imagen aquí

Observe la gran barra negra a la derecha. ¿Qué está causando esto?

Para reproducir esto, necesita:

  • iOS7
  • App con Base SDK configurado en 6.1 (quizás incluso más bajo SDK también, no lo he probado aún)
  • iPhone 5 / 5c / 5s
  • Solo sucede con las imágenes que se tomaron con la camera del iPhone 5 / 5c / 5s (puedes usar la image original que enlazé arriba para probar)

NOTA: Para que quede claro, la barra negra es parte de la image real. La image que ves allí no es una captura de pantalla de UIImageView, pero la image real se guardó en el disco y se cargó aquí …

Tu pregunta es "¿Qué está causando esto?" Así que me centraré en eso en lugar de dar una solución. Definitivamente, este es un error en iOS 7 que trata sobre imágenes editadas en SDK de base inferior. También podemos descartar que XCode 5 y Base SDK 6.1 causen esto porque estoy recibiendo el mismo problema con XCode 4.6.3 y 6.1 SDK ejecutándose en iOS 7 Simulator.

El origen del problema es que los valores de CropRect calculados por el SDK son incorrectos. Si imprime la info NSDictionary de imagePickerController:didFinishPickingMediaWithInfo , verá que:

iOS 7 ejecutando cualquier SDK menor de 7 obtendremos:

UIImagePickerControllerCropRect = "NSRect: { {154, 495} , {1705, 1705}}";

Al ejecutar iOS 6 o 5 con su SDK nos dará:

UIImagePickerControllerCropRect = "NSRect: {{ 0, 149 }, {1704, 1705}}";

Probablemente esté diciendo, hmm, esos valores y también están cambiando entre SDK. Bueno, sí, si deslizas tu foto hacia abajo y la seleccionas, también obtendrás una barra negra en la parte inferior de la image.

introduzca la descripción de la imagen aquí

Las soluciones sugeridas:

  1. Presente un informe de error a Apple aquí … ¡Hizo eso!

  2. No utilice UIImagePickerControllerEditedImage y tome la image original en su lugar.

  3. Calcula y cultiva tu auto.

  4. Use una biblioteca de recorte de terceros como PEPhotoCropEditor o SSPhotoCropperViewController


Editar: solución muy simple añadida por fan de la respuesta!

Sorprendentemente, puede ser tan simple y elegante recortarlo usted mismo:

 { // There is a bug in iOS. When using ALBUM, you must crop it yourself: fromAlbum = [info objectForKey:UIImagePickerControllerOriginalImage]; fromAlbum = [fromAlbum fixOrientation]; CGRect crop = [[info valueForKey:@"UIImagePickerControllerCropRect"] CGRectValue]; fromAlbum = [self ordinaryCrop:fromAlbum toRect:crop]; } 

Aquí está toda la rutina commonCrop: toRect:

 -(UIImage *)ordinaryCrop:(UIImage *)imageToCrop toRect:(CGRect)cropRect { CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], cropRect); UIImage *cropped = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return cropped; } 

Ahora, como señala Jesse, es fundamental rotar la image correctamente. Esta pieza de código absolutamente increíble de Anomie hace el trabajo:

Orientación de la image del resultado UIImagePickerController de iOS después de la carga

Fijación de la orientación UIImage … UIImage + fixOrientation.h

Es así de simple, espero que ayude a alguien. Gracias de nuevo por las inestimables respuestas aquí.

Creo que terminamos trabajando en problemas similares al nunca pedir la image editada directamente; solicite la image original y la información del recorte ( UIImagePickerControllerCropRect ) y realice el recorte usted mismo. Tenga en count que debe preocuparse por las rotaciones en la image fuente si hace el recorte usted mismo.

Puede que la respuesta en esta pregunta sea útil para implementar este trabajo.

Intente search y cambiar el modo (Ajuste de aspecto, Aspecto de relleno, Escala de relleno) mediante progtwigción.

Estoy tratando de reproducir este error. Y no tengas suerte en el simulador, el simulador de 64 bits y el iPad mini. Todos ejecutan iOS 7.0.

Puse su código en mi aplicación:

 UIImage *image = [info valueForKey:UIImagePickerControllerEditedImage]; if (!image) image = [info valueForKey:UIImagePickerControllerOriginalImage]; // Save photo to custom album only if taken by camera if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) [ALAssetsLibrary saveImageToCustomAlbum:image assetURL:[info valueForKey:UIImagePickerControllerReferenceURL]]; NSData *d = UIImagePNGRepresentation(image); [d writeToFile:@"/Volumes/Alko/Temp/test.png" atomically:YES]; UIImageWriteToSavedPhotosAlbum(image, nil, NULL, nil); [self setImage:image]; [self dismissPicker:picker]; [self photoPickerDidFinish]; 

Y funciona correctamente usando la image descargada de http://i.imgur.com/7KUIGLt.jpg . Creo que tienes un problema en tu aplicación, no en UIImagePickerController.