UIImagePickerController错误

时间:2013-10-16 07:49:48

标签: ios objective-c cocoa-touch ios7 uiimagepickercontroller

我认为我在最新的iOS 7中发现了一个错误,它通过运行基本SDK设置为iOS 6.1的应用程序(可能甚至更低版本,还没有测试过)

我的照片库中有这张图片:http://i.imgur.com/7KUIGLt.jpg

我通过以下方式呈现UIImagePickerController:

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

我将所选图像保存到桌面(我在模拟器上运行,但这也可以在设备上运行)

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

这是结果图像: enter image description here

注意右边的大黑条。造成这种情况的原因是什么?

要重现这一点,您需要:

  • iOS 7
  • 将基本SDK设置为6.1的应用程序(可能甚至更低的SDK,我还没有尝试过)
  • iPhone 5 / 5c / 5s
  • 仅适用于使用iPhone 5 / 5c / 5s相机拍摄的照片(您可以使用我上面链接的原始图像进行测试)

注意:为了清楚起见,黑条是实际图像的一部分。你看到的图像没有UIImageView的截图,但实际图像保存到磁盘并上传到这里......

4 个答案:

答案 0 :(得分:22)

你的问题是“造成这种情况的原因是什么?”因此,我将专注于此而不是给出一个解决方法。 这绝对是iOS 7中处理较低基础SDK中编辑图像的错误。我们也可以排除XCode 5&基础SDK 6.1引起这种情况,因为我遇到了与XCode 4.6.3& 6.1在iOS 7 Simulator上运行的SDK。

问题的根源是SDK计算的CropRect值是错误的。 如果您打印出来自info的{​​{1}} NSDictionary,您会看到:

运行任何低于7的SDK的iOS 7我们都会得到:

  

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

使用SDK运行iOS 6或5时会给我们:

  

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

你可能会说,嗯,那些y值也在SDK之间发生变化。好吧,是的,如果你将你的照片一直向下滑动并选择它,你还会在照片的底部找到一个黑色条。

enter image description here

建议的解决方案:

  1. File a bug report to Apple here ......那样做了!

  2. 请勿使用imagePickerController:didFinishPickingMediaWithInfo并改为拍摄原始照片。

  3. 计算并完成自我裁剪。

  4. 使用第三方裁剪库,例如PEPhotoCropEditorSSPhotoCropperViewController


  5. 编辑 - 答案的粉丝添加了非常简单的解决方案!

    令人惊讶的是,自己裁剪它可以是这么简单和优雅:

    UIImagePickerControllerEditedImage

    这是整个例程normalCrop:toRect:

    {
    // 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];
    }
    

    现在正如Jesse所指出的那样,正确旋转图像至关重要。 Anomie这段令人难以置信的代码完成了这项工作:

    iOS UIImagePickerController result image orientation after upload

    修复UIImage方向.. UIImage + fixOrientation.h

    就这么简单,希望它对某人有所帮助。再次感谢这里无价的答案。

答案 1 :(得分:4)

我相信我们最终解决了类似的问题,因为他们从不直接询问编辑过的图像;询问原始图像和裁剪信息(UIImagePickerControllerCropRect)并自行裁剪。请注意,如果您自己进行裁剪,则需要担心源图像中的旋转。

您可能会发现answer in this question对实施此解决方案很有帮助。

答案 2 :(得分:-1)

以编程方式尝试查找和更改模式(Aspect Fit,Aspect Fill,Scale to Fill)。

答案 3 :(得分:-2)

我正在尝试重现此错误。并且在模拟器,模拟器64位和iPad mini上没有运气。全部运行iOS 7.0。

我把你的代码放在我的应用中:

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

使用从http://i.imgur.com/7KUIGLt.jpg下载的图片,它可以正常工作。 我认为你的应用程序存在问题,而不是UIImagePickerController。