【Swift/PhotoKit】PHPickerViewControllerで画像のメタデータ取得する方法!

この記事からわかること

  • Swift/PhotoKitPHPickerViewController使い方
  • 画像メタデータ(撮影日時ロケーションなど)情報取得する方法
  • 取得できるメタデータ情報

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

PHPickerViewControllerアルバムから写真を取得する方法は以下の記事を参考にしてください。

PHPickerViewControllerで画像のメタデータ取得する方法

PHPickerViewControllerを使用してアルバムから写真を取得している場合写真のメタデータ(撮影日時や撮影地など)を取得するにはいくつか注意点がありました。

  1. info.plistにNSPhotoLibraryUsageDescriptionキーを追加
  2. PHPickerConfigurationにPHPhotoLibrary.shared()を渡す
  3. PHPickerResultからメタデータを取得する

info.plistにNSPhotoLibraryUsageDescriptionキーを追加

PHPickerViewControllerを使用した方法では不要であったアプリ内からデバイスのカメラロールにアクセスするためのNSPhotoLibraryUsageDescriptionキーを「info.plist」に追加する必要がありました。

【Swift UIKit】画像をカメラロールから保存/取得/削除する方法!

「info.plist」を開いたらKeyにNSPhotoLibraryUsageDescriptionと入力し、Valueにはカメラロールを使用する旨を記載しておきます。

PHPickerConfigurationにPHPhotoLibrary.shared()を渡す

PHPickerConfigurationをインスタンス化する際にシングルトンになっているPHPhotoLibrary.shared()を渡す必要があります。

var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
configuration.filter = .images
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = context.coordinator

PHPickerResultからメタデータを取得する

これで準備ができたのでPHPickerViewControllerDelegatepicker(PHPickerViewController, didFinishPicking: [PHPickerResult])メソッドで受け取ったPHPickerResult型からassetIdentifierを取得し、PHAsset.fetchAssetsメソッドをPHAsset型を取得することで画像のメタデータに参照することができました。

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    parent.presentationMode.wrappedValue.dismiss()

    for result in results {  
        // メタ情報を取得する
        if let assetId = result.assetIdentifier {
          let assetResults = PHAsset.fetchAssets(withLocalIdentifiers: [assetId], options: nil)
            print("撮影日時:\(assetResults.firstObject?.creationDate)")
            print("撮影地 :\(assetResults.firstObject?.location?.coordinate)")
        }
    }
}

取得できるメタデータ情報

PHAsset型が取得できれば以下のメタデータを取得できるようになります。

class PHAsset : PHObject {
    var mediaType: PHAssetMediaType // ビデオやオーディオなどのアセットのタイプ
    var mediaSubtypes: PHAssetMediaSubtype // アセットのサブタイプ パノラマ写真や高フレームレートのビデオなど、特別な種類のアセットを識別
    var sourceType: PHAssetSourceType // アセットがフォトライブラリに入る手段
    var pixelWidth: Int // アセットデータの幅 
    var pixelHeight: Int // アセットデータの高さ 
    var creationDate: Date? // アセットの作成日時。
    var modifiedDate: Date? // アセットが最後に変更された日時
    var location: CLLocation? // アセットの位置情報。
    var duration: TimeInterval // 動画アセットの長さ (秒単位)
    var isFavorite: Bool // お気に入り
    var isHidden: Bool // 非表示
    var hasAdjustments: Bool // アセットに調整データが含まれているかどうか
    var adjustmentFormatIdentifier: NSString? // 調整フォーマットの識別子
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index