从AVCaptureVideoPreviewLayer获取图像

时间:2014-06-13 17:50:31

标签: objective-c ios7 avcapturesession

我基本上克隆Cropping a captured image exactly to how it looks in AVCaptureVideoPreviewLayer因为询问原始海报他们是否发现解决方案不是“答案”而且我无法发表评论,因为我没有足够的声誉......

我正在构建的应用程序将始终处于纵向模式,因为在这种情况下轮换并不重要。 我有一个AVCaptureSession,AVCaptureVideoPreviewLayer连接到一个大小为320x240的UIView,它位于顶部布局指南的位置。

我已经捕获了输入工作,但我收到的图像是偏斜的,并显示比我正在显示的部分更多。如何捕获AVCaptureVideoPreviewLayer中显示的区域?

1 个答案:

答案 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这就是肖像图像的原因,你必须换掉尺寸;)