微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决裁剪 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 举报,一经查实,本站将立刻删除。