因此,我正在使用AVCaptureSession与前置摄像头拍照。我还在此 session 中创建PreviewLayer,以在屏幕上显示当前图像。
previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
一切都按预期进行。
但是现在我有一个问题,因为我需要实现一个按钮,该按钮可以翻转/镜像(变换)此预览层-因此用户可以选择拍摄普通的自拍照图片或进行镜像。
我已经尝试过转换PreviewLayer,并且它可以运行。问题在于,如果旋转设备,则预览图片会因为变换而以其他方式旋转。 (默认情况下,或任何其他相机应用程序的图片随相机一起旋转)。任何人都知道如何实现这一目标吗?
镜像预览层:(我尝试过转换层,甚至以后再查看,结果相同)。
@IBAction func mirrorCamera(_ sender: AnyObject) {
cameraMirrored = !cameraMirrored
if cameraMirrored {
// TRANSFORMING VIEW
self.videoPreviewView.transform = CGAffineTransform(scaleX: -1, y: 1);
// OR LAYER
self.previewLayer.transform = CATransform3DMakeScale(-1, 1, 1);
} else {
self.videoPreviewView.transform = CGAffineTransform(scaleX: 1, y: 1);
self.videoPreviewView.transform = CATransform3DMakeScale(1, 1, 1);
}
}
最佳答案
如今,如果直接使用预览层的mirrored
属性,则会在运行时收到弃用警告。当前的方法是直接使用相机的连接。您必须执行类似的操作(下面的代码不是真实的代码,属性名称可能会有所不同,但是您知道了)
if (cameraPreviewLayer.connection.SupportsVideoMirroring) {
cameraPreviewLayer.connection.automaticallyAdjustsVideoMirroring = false
cameraPreviewLayer.connection.videoMirrored = true
}