我有AVCaptureSession的实现,我的目标是让用户拍摄照片,只将图像的一部分保存在红色方块边框内,如下图所示:
AVCaptureSession的previewLayer(相机)从(0,0)(左上角)跨越到我的相机控制栏(位于包含快门的视图的正上方)的底部.我的导航栏和控制栏是半透明的,所以相机可以显示.
我正在使用[captureSession setSessionPreset:AVCaptureSessionPresetPhoto];以确保保存到相机胶卷的原始图像与Apple的相机一样.
用户将能够以纵向,横向左右拍摄照片,因此裁剪方法必须考虑到这一点.
到目前为止,我已经尝试使用这段代码裁剪原始图像:
DDLogVerbose(@"%@: Image crop rect: (%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的位置.
这是CGRect的日志输出:
Image crop rect: (0.000000,53.000000,320.000000,322.000000)
这也描述了超视图中红色边框视图的框架.
有什么重要的我俯瞰吗?
附:原始图像尺寸(以纵向模式拍摄)为:
Original image size: (2448.000000,3264.000000)
解决方法
您可以使用CGImageCreateWithImageInRect裁剪图像:
CGImageRef imageRef = CGImageCreateWithImageInRect([uncroppedImage CGImage],bounds); UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef);