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];`
我希望这可以帮助别人。