【问题标题】:Getting Photo Data from AVCapturePhotoCaptureDelegate从 AVCapturePhotoCaptureDelegate 获取照片数据
【发布时间】:2017-01-29 04:39:22
【问题描述】:

我目前正在尝试构建一个有趣的相机应用程序,但遇到了问题。

我使用的是 Apple 为您提供的拍摄照片或视频过程的示例。在这里找到:

https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.html

我在使用 PhotoCaptureDelegate 时遇到问题。因此,目前当用户拍照时,它会将其保存到用户照片库中。我想做的是,在它捕捉到我想要存储照片的photoData 对象的照片之后。这样我就可以在您保存之前将照片显示在另一个视图上作为预览。

这是 Apple 建议使用的:

  func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
    if let error = error {
        print("Error capturing photo: \(error)")
        didFinish()
        return
    }

    guard let photoData = photoData else {
        print("No photo data resource")
        didFinish()
        return
    }

    PHPhotoLibrary.requestAuthorization { [unowned self] status in
        if status == .authorized {
            PHPhotoLibrary.shared().performChanges({ [unowned self] in
                    let creationRequest = PHAssetCreationRequest.forAsset()
                    creationRequest.addResource(with: .photo, data: photoData, options: nil)

                    if let livePhotoCompanionMovieURL = self.livePhotoCompanionMovieURL {
                        let livePhotoCompanionMovieFileResourceOptions = PHAssetResourceCreationOptions()
                        livePhotoCompanionMovieFileResourceOptions.shouldMoveFile = true
                        creationRequest.addResource(with: .pairedVideo, fileURL: livePhotoCompanionMovieURL, options: livePhotoCompanionMovieFileResourceOptions)
                    }

                }, completionHandler: { [unowned self] success, error in
                    if let error = error {
                        print("Error occurered while saving photo to photo library: \(error)")
                    }

                    self.didFinish()
                }
            )
        }
        else {
            self.didFinish()
        }
    }
}

如何从我的委托中获取photoData 对象并将其传递回我的视图控制器,即调用此委托?

【问题讨论】:

    标签: swift avcam


    【解决方案1】:

    有几种方法可以解决这个问题。您还可以让您的视图控制器拥有照片捕获委托(如 Apple 的示例)并在拍摄照片后将其传回。你也可以让你的视图控制器成为照片捕捉委托,而不用担心传递任何东西!

    1) 备份照片

    有(再次)几种方法可以做到这一点。您可以让委托将值传递回控制器。你也可以让代理告诉控制器它已经完成,然后让控制器来抓取照片。我将在下面解释第二种方式。

    查看 Apple 的示例,我们可以看到 PhotoCaptureDelegate 已经告诉控制器何时完成!每当创建 PhotoCaptureDelegate 对象时,都会传递一个 completed 块。

    要让控制器抓取照片,我们只需要将照片对象公开!

    1. PhotoCaptureDelegate 中的private var photoData: Data? = nil 更改为public var photoData: Data? = nil
    2. CameraViewController 中定义completed 块时,您现在拥有照片数据:
        ...
        , completed: { [unowned self] photoCaptureDelegate in
            self.sessionQueue.async { [unowned self] in
                self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = nil
                if let photoData = photoCaptureDelegate.photoData {
                    // You now have the photo data!
                    // You can pass this to another method in the Controller now                
                }
            }
        }
        ...
    

    2) View Controller 作为 AVCapturePhotoCaptureDelegate

    解决此问题的另一种方法是让您的 ViewController 成为 AVCapturePhotoCaptureDelegate。然后,您将已经在视图控制器中拥有照片数据!它可能看起来像这样:

    class MyViewController: UIViewController, AVCapturePhotoCaptureDelegate {
    
        ...
    
        func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
            guard let photoData = photoData else {
                return
            }
            // You now have your photo data!
        }
    }
    

    【讨论】:

    • 非常感谢我已经为此苦苦挣扎了一段时间!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多