我认为我在最新的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];
}
这是结果图像:
注意右边的大黑条。造成这种情况的原因是什么?
要重现这一点,您需要:
注意:为了清楚起见,黑条是实际图像的一部分。你看到的图像没有UIImageView的截图,但实际图像保存到磁盘并上传到这里......
答案 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之间发生变化。好吧,是的,如果你将你的照片一直向下滑动并选择它,你还会在照片的底部找到一个黑色条。
建议的解决方案:
File a bug report to Apple here ......那样做了!
请勿使用imagePickerController:didFinishPickingMediaWithInfo
并改为拍摄原始照片。
计算并完成自我裁剪。
使用第三方裁剪库,例如PEPhotoCropEditor或SSPhotoCropperViewController
编辑 - 答案的粉丝添加了非常简单的解决方案!
令人惊讶的是,自己裁剪它可以是这么简单和优雅:
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。