キャプチャした写真の保存

オリジナル情報源

https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/capturing_still_and_live_photos/saving_captured_photos

概要

AVCapturePhotoOutputで写真のキャプチャを完了すると、静止画像データだけでなく、カメラのメタデータとキャプチャでリクエストした補助画像(サムネイルや深度マップなど)を含むAVCapturePhotoオブジェクトを受け取ります。これらのタイプのデータをAVCapturePhotoから個別に取得するか、そのfileDataRepresentation()メソッドを呼び出して、AVCapturePhotoSettingsでその写真に要求したコーデックとファイル形式を使用して、Dataオブジェクトをディスクに書き込む準備をすることができます。

通常、写真をキャプチャした後、そのデータをユーザーのフォトライブラリに追加します。Photosフレームワークを使用してそうすることができます。

フォトライブラリの使用許可をリクエストする

iOSがカメラとマイクへのアクセスをユーザーに許可することでユーザーのプライバシーを保護するのと同じように、システムはユーザーにアプリにフォトライブラリへのアクセスを許可することも要求します。アプリの許可を取得するには:

  1. アプリケーションのInfo.plistファイル内のNSPhotoLibraryUsageDescription キーを含むように構成します。このキーの値は、フォトライブラリへのアクセスを要求するシステムアラートでユーザーに表示されるメッセージです。このメッセージを使用して、アプリにそのようなアクセスが必要な理由をユーザーに説明します。
  2. 承認を確認またはリクエストします。このPHPhotoLibrary requestAuthorization(_:)メソッドを使用して、ユーザーが最初にアプリのカメラ機能を開いたときなど、アプリに適切なタイミングでiOSにフォトライブラリへのアクセスを求めるアラートが表示されるようにします。(ユーザーが最初の写真を撮るまで待たないでください。許可の警告により、複数の写真を撮ることができなくなります。)

以下のコードは、アクセスを確認するための簡単なワークフローを示しています。

PHPhotoLibrary.requestAuthorization { status in
    guard status == .authorized else { return }
    
    // Use PHPhotoLibrary.shared().performChanges(...) to add assets.
}

作成リクエストを使用して写真アセットを追加する

このAVCapturePhoto fileDataRepresentation()メソッドは、写真キャプチャからのすべての画像データ、補助画像データ、およびメタデータを、ディスクに書き込む準備ができている単一のデータオブジェクトにパッケージ化します。そのデータを写真ライブラリに追加するには、PHPhotoLibraryおよびPHAssetCreationRequestクラスを使用します。

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    guard error == nil else { print("Error capturing photo: \(error!)"); return }

    PHPhotoLibrary.requestAuthorization { status in
        guard status == .authorized else { return }
        
        PHPhotoLibrary.shared().performChanges({
            // Add the captured photo's file data as the main resource for the Photos asset.
            let creationRequest = PHAssetCreationRequest.forAsset()
            creationRequest.addResource(with: .photo, data: photo.fileDataRepresentation()!, options: nil)
        }, completionHandler: self.handlePhotoLibraryError)
    }
}

注意

performChanges(_:completionHandler:)ブロックは、1つのアトミックアップデートではフォトライブラリに複数の変更を行うことができます。たとえば、新しく作成したアセットをアルバムに追加できます。または、ブラケットキャプチャを実行すると、複数のdidFinishProcessingPhoto結果を蓄積して、それらを一緒にフォトライブラリに保存できます。詳細については、Photosドキュメントを参照してください。

投稿者: admin

Free Software Engineer

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です