2014-09-26 57 views
0

我正在使用相机(iOS 7,iPad mini)拍摄照片并将其裁剪为正方形。我非常满意从以下代码中获得的默认裁剪功能:用相机拍摄的iOS裁剪图像

imagePickerController = [[UIImagePickerController alloc] init]; 
    imagePickerController.delegate = self; 
    imagePickerController.mediaTypes = @[(NSString *) kUTTypeImage]; 
    imagePickerController.allowsEditing = YES; 
    UIImage *image = info[UIImagePickerControllerEditedImage] 

它给了我一个平方叠加在我拍摄的图像上。如果我放大,我可以将图像平移一下。不过,我很惊讶,我无法上下移动图像(没有缩放),将裁剪矩形移到图像上。如果我尝试这样做,它就会弹回到原来的位置。我错过了什么?还是仅仅缺少这个功能?

从这里的许多问题来看,大多数人的回答都令人失望,“必须以自定义的方式完成”。

+0

是的,我有我的应用程序相同的情况下 – 2014-09-26 11:04:08

回答

0

这是最简单的方法(不需要重新实现UIImagePickerController)。首先,使用覆盖图使相机区域呈现正方形。这里有一个例子3.5" 屏幕(你需要更新它为iPhone 5的工作):

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; 
imagePickerController.sourceType = source; 

if (source == UIImagePickerControllerSourceTypeCamera) { 
    //Create camera overlay 
    CGRect f = imagePickerController.view.bounds; 
    f.size.height -= imagePickerController.navigationBar.bounds.size.height; 
    CGFloat barHeight = (f.size.height - f.size.width)/2; 
    UIGraphicsBeginImageContext(f.size); 
    [[UIColor colorWithWhite:0 alpha:.5] set]; 
    UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), kCGBlendModeNormal); 
    UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), kCGBlendModeNormal); 
    UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; 
    overlayIV.image = overlayImage; 
    [imagePickerController.cameraOverlayView addSubview:overlayIV]; 
} 

imagePickerController.delegate = self; 
[self presentViewController:imagePickerController animated:YES completion:nil]; 

然后,你会得到一张图片后,从的UIImagePickerController回来,这作物的方形像这样的东西。!。

//Crop the image to a square 
CGSize imageSize = image.size; 
CGFloat width = imageSize.width; 
CGFloat height = imageSize.height; 
if (width != height) { 
    CGFloat newDimension = MIN(width, height); 
    CGFloat widthOffset = (width - newDimension)/2; 
    CGFloat heightOffset = (height - newDimension)/2; 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), NO, 0.); 
    [image drawAtPoint:CGPointMake(-widthOffset, -heightOffset) 
        blendMode:kCGBlendModeCopy 
         alpha:1.]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

这是目标C代码

+0

感谢这个答案虽然我没有实现它这个解决方案似乎工作,我却不得不希望会有我缺少的默认解决方案。 – marqram 2014-11-05 14:06:55

相关问题