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