问题描述
我正在尝试使用 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 (将#修改为@)