iOS自定义UIImagePickerController相机裁剪到正方形

我正在尝试创build一个像Instagram一样的相机,用户可以看到一个盒子,并且图像会被裁剪到那个盒子里。 由于某种原因,相机不能一直走到屏幕的底部,并在接近尾声时切断。 我也想知道如何在这个广场内将图片剪裁成320×320?

在这里输入图像说明

这是最简单的方法(不需要重新实现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(); } 

你完成了。

@Anders的答案是非常接近我的iPhone 5正确的。我做了以下修改,添加一个覆盖硬编码的iPhone 5:

 CGRect f = imagePickerController.view.bounds; f.size.height -= imagePickerController.navigationBar.bounds.size.height; UIGraphicsBeginImageContext(f.size); [[UIColor colorWithWhite:0 alpha:.5] set]; UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, 124.0), kCGBlendModeNormal); UIRectFillUsingBlendMode(CGRectMake(0, 444, f.size.width, 52), kCGBlendModeNormal); UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f]; overlayIV.image = overlayImage; overlayIV.alpha = 0.7f; [imagePickerController setCameraOverlayView:overlayIV];` 

我希望这可以帮助别人。