裁剪 AVFoundation 图像输出以匹配屏幕 - Swift

问题描述

我正在尝试使用 Xcode 中的 AVFoundation iOS 框架构建自定义全屏相机应用程序。 图像的预览显示使用:

    func displayPreview(on view: UIView) throws {
    guard let captureSession = self.captureSession,captureSession.isRunning else { throw CameraControllerError.captureSessionIsMissing }
     
        self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        self.previewLayer?.connection?.videoOrientation = .portrait
     
        view.layer.insertSublayer(self.previewLayer!,at: 0)
        self.previewLayer?.frame = view.frame
    
}

这个函数还设置了previewLayer的contentMode来填满整个屏幕:

self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill

通过这样做,将保存到照片库的部分结果图像超出了屏幕边界。 使用以下方法生成输出

func captureImage(completion: @escaping (UIImage?,Error?) -> Void) {
    guard let captureSession = captureSession,captureSession.isRunning else { completion(nil,CameraControllerError.captureSessionIsMissing); return }
     
        let settings = AVCapturePhotoSettings()
        //settings.flashMode = self.flashMode
     
        self.photoOutput?.capturePhoto(with: settings,delegate: self)
        self.photoCaptureCompletionBlock = completion
}


extension CameraController: AVCapturePhotoCaptureDelegate {
public func photoOutput(_ captureOutput: AVCapturePhotoOutput,didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?,previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,resolvedSettings: AVCaptureResolvedPhotoSettings,bracketSettings: AVCaptureBracketedStillimagesettings?,error: Swift.Error?) {
    if let error = error { self.photoCaptureCompletionBlock?(nil,error) }
        
    else if let buffer = photoSampleBuffer,let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer,previewPhotoSampleBuffer: nil),let image = UIImage(data: data) {
        
        self.photoCaptureCompletionBlock?(image,nil)
    }
        
    else {
        self.photoCaptureCompletionBlock?(nil,CameraControllerError.unkNown)
    }
}

我想要做的是将输出 UIImage 裁剪为具有相同屏幕纵横比的矩形,以便用户实际拍摄他在屏幕上看到的内容 我做了一些实验,但没有达到我想要的效果

我使用的是 Xcode 12 和 Swift 5

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)