对于我正在开发的应用程序,我让用户指定他们想要在相机上捕获的对象的尺寸(例如30“x 40”)。我要做的下一件事是,在它上面显示带有cameraOverlayView的摄像头,只显示一个带有正确比例的描边透明正方形来捕获该对象。
所以我尝试了两件事来让它发挥作用:
使用UIViewController使用AVCaptureVideoPreviewLayer
显示带有实时视频供稿的视图。在该Feed的顶部,我显示了一个透明视图,该视图绘制了具有正确尺寸的正方形(使用用户指定的比率)。
和
在另一次尝试中,我创建了一个UIViewController,其中包含一个弹出UIImagePickerController
的按钮。使用此控制器,我还创建了一个视图,我使用cameraOverlayView
属性将其附加到选取器。
我使用这两种方法的主要问题是实际拍摄的图像总是比我在屏幕上看到的图像大,但我不完全确定如何在图片之后剪切图像片段已被采取。
所以例如: 我显示了我的UIImagePickerController,我在上面放了一个覆盖图,显示一个300 x 400px大的正方形。用户使用此方块拍摄其对象的图片,并将其对象置于此广场内。
拍摄照片,但不是320x480(或640x960)的图片,而是获得3500x2400的结果(或类似的结果。它与屏幕比例(当然)完全不同。
然后我如何确保切出图像的右侧部分。
实际计算应该显示的正方形大小的代码(并且应该用于确定应该切割图片的哪一部分):
+ (CGRect) getFrameRect:(CGRect) rect forSize:(CGSize) frameSize {
if (CGSizeEqualToSize(frameSize, CGSizeZero))
return CGRectZero;
float maxWidth = rect.size.width - 20;
float maxHeight = rect.size.height - 20;
float ratioX = maxWidth / frameSize.width;
float ratioY = maxHeight / frameSize.height;
float ratio = MIN(ratioX, ratioY);
float newWidth = frameSize.width * ratio;
float newHeight = frameSize.height * ratio;
float x = (rect.size.width - newWidth) / 2;
float y = (rect.size.height - newHeight) / 2;
return CGRectMake(x, y, newWidth, newHeight);
}
这确定了可以使用frameSize参数中指定的比率创建的最大正方形,其中应在rect参数中提供正方形的尺寸。
我想到了一些解决方案,但我不确定这是否可行。
答案 0 :(得分:3)
好的,我找到了解决方案:
使用相机拍摄照片时,预览屏幕仅显示您拍摄的照片的一部分。
当您的iOS设备处于纵向模式时,照片高度会缩小到屏幕高度,并且只显示中间的640px。
较暗的红色部分是屏幕上显示的内容。因此,当您拍摄照片时,您需要将图像缩小到屏幕的最大高度,以获得正确的宽度。
之后我将中间的640x960像素剪切掉,以实际获得与拍摄时相同的图像。
之后,我的矩形叠加层的坐标与我的叠加层相同。
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissModalViewControllerAnimated:YES];
UIImage* artImage = [info objectForKey:UIImagePickerControllerOriginalImage];
CGFloat imageHeightRatio = artImage.size.height / 960;
CGFloat imageWidth = artImage.size.width / imageHeightRatio;
CGSize newImageSize = CGSizeMake(imageWidth, 960);
artImage = [artImage imageByScalingProportionallyToSize:newImageSize];
CGRect cutOutRect = CGRectMake((artImage.size.width / 2) - (640 / 2), 0, 640, 960);
artImage = [self imageByCropping:artImage toRect:cutOutRect];
CGRect imageCutRect = [FrameSizeCalculations getFrameRect:CGRectMake(0,0, artImage.size.width, artImage.size.height) forSize:self.frameSize];
artImage = [self imageByCropping:artImage toRect:imageCutRect];
CGRect imageViewRect = CGRectInset(_containmentView.bounds, 10, 10);
NSLog(@"ContainmentView: %f x %f x %f x %f",
_containmentView.frame.origin.x,
_containmentView.frame.origin.y,
_containmentView.frame.size.width,
_containmentView.frame.size.height
);
NSLog(@"imageViewRect: %f x %f x %f x %f",
imageViewRect.origin.x,
imageViewRect.origin.y,
imageViewRect.size.width,
imageViewRect.size.height
);
_imageView.frame = [FrameSizeCalculations getFrameRect:imageViewRect forSize:self.frameSize];
NSLog(@"imageViewRect: %f x %f x %f x %f",
_imageView.frame.origin.x,
_imageView.frame.origin.y,
_imageView.frame.size.width,
_imageView.frame.size.height
);
_imageView.contentMode = UIViewContentModeScaleAspectFill;
_imageView.image = artImage;
}