Illust & Music 月の高いところ

今日のプリン言

謎のプリン語る。
一人書く人増えました。

Swift4、Photos frameworkのPHAssetからあらゆる情報を引っ張ってくる

2017年12月13日

みやびプリン 140 87

500 320

Swift4、Photos frameworkのPHAssetからあらゆる情報を引っ張ってくる - サムネイル

※この記事は2年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。

どうも、
昨日なんとか自学の卒検合格しました、みやびです。
あのクソ運動音痴の僕が取れたなんて、いまだに信じられん・・・!
あとは本免試験だけだ!!

さて、そんなどうでもいいことは置いておいて・・・。

表記の件、
載ってるエントリーがほとんどなく、ほんとに苦労したので、覚書的に。
もうね、ただ、写真の保存場所(パス)を取ってきたいだけなのに、えらい苦労した。

まずは下記の通りに、
まずは、カメラロールの全写真のPHAssetを取ってくる。
(iOS11以降は、info.plistの修正、もしかしたらPhotos frameworkの追加が必要なので、ご自分でググってやってください。)

import UIKit
// これ忘れるとそもそも使えない
import Photos

class ViewController: UIViewController {
  // アラート変数
  var photoAlert: UIAlertController? = nil
  // PHAssetのリスト変数
  var photoAssets: Array<PHAsset> = Array<PHAsset>()

  override func viewDidLoad() {
    super.viewDidLoad()

  }
  
  // カメラロールへのアクセス許可を確認。許可ないなら、アラートを出す
  private func libraryRequestAuthorization() {
    PHPhotoLibrary.requestAuthorization({ [weak self] status in
      switch status {
      case .authorized:
        self.getAllPhotosInfo()
      case .denied:
        self.photoAlert = self.showDeniedAlert()
        callBack()
      case .notDetermined:
        print("NotDetermined")
      case .restricted:
        print("Restricted")
      }
    })
  }
  

  // カメラロールへのアクセスが拒否されている場合のアラートを生成するメソッド
  private func showDeniedAlert() -> UIAlertController {
    let alert: UIAlertController = UIAlertController(title: "エラー", message: "「写真」へのアクセスが拒否されています。設定より変更してください。", preferredStyle: .alert)
    let cancel: UIAlertAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
    let ok: UIAlertAction = UIAlertAction(title: "設定画面へ", style: .default, handler: { [weak self] (action) -> Void in
      self.transitionToSettingsApplition()
    })
    alert.addAction(cancel)
    alert.addAction(ok)
    
    return alert
  }

  private func transitionToSettingsApplition() {
    let url = URL(string: UIApplicationOpenSettingsURLString)
    if let url = url {
      UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
  }

  // カメラロールにアクセスできるなら、そのまま、リストにAssetをぶち込む
  private func getAllPhotosInfo() {
    let assets: PHFetchResult = PHAsset.fetchAssets(with: .image, options: nil)
    
    assets.enumerateObjects({ [weak self] (asset, index, stop) -> Void in
      self.photoAssets.append(asset as PHAsset)    
    })
    
  }
}

これで、self.photoAssetsにカメラロールの全写真のリストを取ってこれた。
さて、この写真の情報だが、まずデバイス内に保存されているディレクトリを取ってくるには、下記のやり方。

// あらゆるものを省略します

if let firstAsset = self.photoAssets[0] {
  // directoryに、画像保存場所パスを入れる
  let directory: String = firstAsset.value(forKey: "directory") as! String
}

このvalueメソッドは、オブジェクト内の、対象のkeyを取り出すことができる。 けっこう便利。 (ただ、do catch構文を使っても、エラーで止まるので注意)

手軽にホームページを作成【おちゃのこさいさい】 - メイン

こんな簡単なの探すのに、えらい時間かかった。 副産物として、PHAssetで取ってこれる、写真情報っぽいkeyを全部知ることができたので、 列挙する。

localResourcesState:?
avalanchePickType:?
groupingState:グループの状態?
groupingUUID:グループのID?
locationData:撮影地の緯度経度
savedAssetType:アセットのタイプ
videoCpVisibilityState:ムービーの状態?
cloudIsDeletable:クラウドで消してるかどうか?
sceneClassifications:?
distanceIdentity:?
imageOrientation:写真の向き
aspectRatio:写真のアスペクト比
uniformTypeIdentifier:?
persistenceState:?
thumbnailIndex:サムネイルの番号
directory:保存場所
filename:ファイル名
trashedDate:更新日?
adjustmentTimestamp:撮った日のタイムスタンプ?
thumbnailIdentifier:サムネイルのなんか
complete:完了?
ALAssetURL:アセットで取り出した時のパス
exifOrientation:写真の向き
originalColorSpace:色?
curationScore:?
cloudPlaceholderKind:?
hasAdjustments:揃ってるかどうか?
videoCpDurationValue:ムービーのなんか?
locationCoordinate:撮影場所のなんか?
playbackVariation:?
hasPhotoColorAdjustments:色のなんか情報あるか?
faceRegions:顔認証のなんか?
faceAreaMinX:顔認証の横座標の最小値?
faceAreaMaxX:顔認証の横座標の最大値?
faceAreaMinY:顔認証の縦座標の最小値?
faceAreaMaxY:顔認証の縦座標の最大値?
cloudIdentifier:クラウドのなんか?
faceAdjustmentVersion:顔認証のバージョン?
assetDescriptionWasSet:アセットの概要?
canUseLocationCoordinateForLocation:撮影地で使える?
isVideo:ビデオかどうか
isLoopingVideo:リピートビデオかどうか
isPhoto:写真かどうか
isAudio:音声データかどうか
isPhotoStreamPhoto:フォトストリームの写真かどうか
isCloudSharedAsset:クラウドでシェアしてるかどうか
isCloudPlaceholder:クラウドのなんか
isCloudPhotoLibraryAsset:クラウドライブラリのアセットかどうか
isStreamedVideo:ビデオストリームのかどうか
isHighFrameRateVideo:高解像度かどうか?
isHDVideo:HDビデオかどうか
isJPEG:JPEGかどうか
isRAW:RAWかどうか
isAnimatedGIF:アニメーションGIFかどうか
isPartOfBurst:?
isPartOfGroup:なんぞ?
isPrimaryInGroup:プライマリーのグループのものかどうか?
isPhotoIris:写真のなんか?
isPhotoIrisPlaceholder:写真のなんか?
canPlayPhotoIris:写真のなんか?
canPlayAutoloop:オートループできるかどうか
canPlayMirror:ミラー再生できるか?
canPlayLongExposure:長時間再生できるか?
canPlayLoopingVideo:ループ再生できるかどうか
isTimelapsePlaceholder:タイムラプスのなんか?
isIncludedInMoments:?
isIncludedInCloudFeeds:クラウドフィードを読みこんでいるかどうか?
trashed:捨てたかどうか?
canPerformSharingAction:?
metadataDebugDescription:メタデータのなんか?
variationSuggestionStatesDetails:?
playbackStyle:?
mediaType:メディアタイプ
mediaSubtypes:メディアのサブタイプ?
pixelWidth:横幅
pixelHeight:高さ
creationDate:作成日
modificationDate:更新日
location:撮影地
duration:?
hidden:非表示かどうか
favorite:?
burstIdentifier:?
burstSelectionTypes:?
representsBurst:?
sourceType:おそらく、オブジェクトにもともとあるプロパティ
hash:おそらく、オブジェクトにもともとあるプロパティ
superclass:おそらく、オブジェクトにもともとあるプロパティ
description:概要
debugDescription:デバッグの概要

横の解説いらないって?
しかも英語読めてない??
まぁまぁ。

使えそうな情報いろいろありそうですね。
して、オブジェクトにもともと備わってるプロパティも入っちゃってるので、あしからず。
この情報を使って、いろいろできそうですね。

ではまた。

黒い砂漠 - メイン

トラックバック(0)

トラックバックURL:

コメントする