Objective c 从AVCaptureVideoPreviewLayer获取图像

Objective c 从AVCaptureVideoPreviewLayer获取图像,objective-c,ios7,avcapturesession,Objective C,Ios7,Avcapturesession,我基本上是克隆人,因为问原始海报他们是否找到了解决方案并不是一个“答案”,我还不能发表评论,因为我没有足够的声誉 我正在构建的应用程序将始终处于纵向模式,因为在这种情况下旋转并不重要。 我有一个AVCaptureSession,AVCaptureVideoPreviewLayer连接到一个大小为320x240的UIView,该UIView紧靠顶部布局指南 我已经捕获了输入,但是我接收到的图像是倾斜的,显示的比我显示的部分多得多。如何仅捕获我的AVCaptureVideoPreviewLayer中

我基本上是克隆人,因为问原始海报他们是否找到了解决方案并不是一个“答案”,我还不能发表评论,因为我没有足够的声誉

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


我已经捕获了输入,但是我接收到的图像是倾斜的,显示的比我显示的部分多得多。如何仅捕获我的AVCaptureVideoPreviewLayer中显示的区域?

请查看
AVCaptureVideoPreviewLayer
s

-(CGRect)metadataOutputRectOfInterestForRect:(CGRect)layerRect
通过此方法,可以轻松地将层的可见CGRect转换为实际相机输出

有一点需要注意:物理摄像机不是“顶面朝上”安装的,而是向右旋转90度。(因此,如果你把iPhone的Home(主页)按钮握在右边,相机实际上是朝上的)

记住这一点,您必须转换上述方法提供的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的“宽度”。这就是为什么对于肖像图像,必须交换大小;)