如何使用 Swift 在 iOS8 中创建与矩形相机框顶部对齐的方形相机预览

How to create a square camera preview aligned with the top of the rectangular camera frame in iOS8 using Swift

我在视图中有一个 UIImageView (self.previewImage),用作 iPad 前置摄像头的预览 window。它是正方形 (768x768) 并且在视图中居中。当我从相机中抓取帧进行保存时,我最终通过切出与帧的 TOP 对齐的正方形(在纵向模式下)将整个矩形帧裁剪成正方形.无论我尝试过什么,预览 window 总是在框架的 CENTER 周围裁剪。

有什么方法可以让预览对齐图像的顶部吗?如果没有,有没有办法在添加到预览之前插入一个可以手动裁剪的处理方法?

我原来的默认预览设置是这样的:

 func setupPreviewLayer() {
    self.previewLayer = AVCaptureVideoPreviewLayer(session: self.cameraSessionController.session)
    self.previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.view.layer.addSublayer(previewLayer)
    previewLayer?.frame = previewImage.frame
}

我玩过 self.previewLayer?.bounds 和 self.previewLayer?.videoGravity 但没有成功。

实际上我只是在我的应用程序中处理了这个问题。问题是宽高比填充会调整大小并将视频源置于预览层的中心。您需要做的是在您拍摄的照片的中心裁剪一个正方形。

据我所知,没有办法 "tell" 视频源与顶部对齐,也没有办法在将视频源放入预览之前添加裁剪视频源的处理方法.拍照后必须裁剪图像。

好指针。 GPUImage 过滤器能够轻松做到这一点。

https://github.com/BradLarson/GPUImage

import UIKit
import GPUImage

class ViewController: UIViewController {

var videoCamera:GPUImageVideoCamera?
var filter:GPUImageCropFilter?

override func viewDidLoad() {
    super.viewDidLoad()

    videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPreset640x480, cameraPosition: .Front)
    videoCamera!.outputImageOrientation = .Portrait;
    filter = GPUImageCropFilter(cropRegion: CGRect(x: 0.0, y: 0, width: 1, height: 0.75))
    videoCamera?.addTarget(filter)
    filter?.addTarget(self.view as GPUImageView)
    videoCamera?.startCameraCapture()
}

}