根据UIView / CGRect的大小将图像裁剪为正方形

我有一个AVCaptureSession的实现,我的目标是让用户拍摄照片并仅将图像的一部分保存在红色方框边框内,如下所示:

UIViewController,具有AVCaptureSession的实现

AVCaptureSession的previewLayer (相机)从(0,0) (左上角)跨越到相机控制条的底部(包含快门的视图上方的条形图)。 我的导航栏和控制栏是半透明的,因此相机可以显示。

我正在使用[captureSession setSessionPreset:AVCaptureSessionPresetPhoto]; 确保保存到相机胶卷的原始图像就像Apple的相机一样。

用户将能够以纵向,横向左右拍摄照片,因此裁剪方法必须考虑到这一点。

到目前为止,我已尝试使用此代码裁剪原始图像:

 DDLogVerbose(@"%@: Image crop rect: (%f, %f, %f, %f)", THIS_FILE, self.imageCropRect.origin.x, self.imageCropRect.origin.y, self.imageCropRect.size.width, self.imageCropRect.size.height); // Create new image context (retina safe) UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.imageCropRect.size.width, self.imageCropRect.size.width), NO, 0.0); // Create rect for image CGRect rect = self.imageCropRect; // Draw the image into the rect [self.captureManager.stillImage drawInRect:rect]; // Saving the image, ending image context UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 

但是,当我看到相机胶卷中的裁剪图像时,它似乎只是压缩了原始图像,而不是像我想的那样丢弃图像的顶部和底部。 它还会在“裁剪”图像的顶部产生53像素的空白区域,这可能是因为我的CGRect的y位置。

这是我对CGRect日志输出:

  Image crop rect: (0.000000, 53.000000, 320.000000, 322.000000) 

这也描述了superview中红色边框视图的框架。

我有什么关键吗?

PS原始图像尺寸(在纵向模式下使用相机拍摄)是:

 Original image size: (2448.000000, 3264.000000) 

您可以使用CGImageCreateWithImageInRect裁剪图像:

 CGImageRef imageRef = CGImageCreateWithImageInRect([uncroppedImage CGImage], bounds); UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); 

不要忘记添加比例参数,否则您将获得低分辨率图像

 CGImageRef imageRef = CGImageCreateWithImageInRect([uncroppedImage CGImage], CGRectMake(0, 0, 30, 120)); [imageView setImage:[UIImage imageWithCGImage:imageRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationUp]]; CGImageRelease(imageRef); 

斯威夫特3:

 let imageRef:CGImage = uncroppedImage.cgImage!.cropping(to: bounds)! let croppedImage:UIImage = UIImage(cgImage: imageRef)