我基本上克隆Cropping a captured image exactly to how it looks in AVCaptureVideoPreviewLayer因为询问原始海报他们是否发现解决方案不是“答案”而且我无法发表评论,因为我没有足够的声誉......
我正在构建的应用程序将始终处于纵向模式,因为在这种情况下轮换并不重要。 我有一个AVCaptureSession,AVCaptureVideoPreviewLayer连接到一个大小为320x240的UIView,它位于顶部布局指南的位置。
我已经捕获了输入工作,但我收到的图像是偏斜的,并显示比我正在显示的部分更多。如何捕获AVCaptureVideoPreviewLayer中显示的区域?
答案 0 :(得分:0)
查看AVCaptureVideoPreviewLayer
s
-(CGRect)metadataOutputRectOfInterestForRect:(CGRect)layerRect
此方法可让您轻松将图层的可见CGRect转换为实际的相机输出。
有一点需要注意:物理相机没有安装在顶部和#34;而是向右旋转90度。 (所以如果你拿着你的iPhone - Home Button,那么相机实际上是正面朝上的。)
记住这一点,您必须转换上述方法为您提供的CGRect,将图像裁剪为屏幕上的内容。
示例:
CGRect visibleLayerFrame = THE ACTUAL VISIBLE AREA IN THE LAYER FRAME
CGRect metaRect = [self.previewView.layer metadataOutputRectOfInterestForRect:visibleLayerFrame];
CGSize originalSize = [originalImage size];
if (UIInterfaceOrientationIsPortrait(_snapInterfaceOrientation)) {
// For portrait images, swap the size of the image because
// here, the output image is actually rotated relative to what you see on screen.
CGFloat temp = originalSize.width;
originalSize.width = originalSize.height;
originalSize.height = temp;
}
// metaRect is fractional, that's why we multiply here
CGRect cropRect;
cropRect.origin.x = metaRect.origin.x * originalSize.width;
cropRect.origin.y = metaRect.origin.y * originalSize.height;
cropRect.size.width = metaRect.size.width * originalSize.width;
cropRect.size.height = metaRect.size.height * originalSize.height;
cropRect = CGRectIntegral(cropRect);
这可能有点令人困惑,但让我真正理解的是:
按住您的设备" Home Button right" - >你会看到x轴实际上位于"高度"你的iPhone,而y轴位于"宽度"你的iPhone这就是肖像图像的原因,你必须换掉尺寸;)