iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Mobile Development

在 iOS 開發路上的大小事2系列 第 14

【在 iOS 開發路上的大小事2-Day14】PhotoKit 好像很好玩 (3)

  • 分享至 

  • xImage
  •  

在上一篇,有講到 PHFetchOptions、PHPhotoLibraryChangeObserver、PHImageManager

在這一篇,會講到 PHAsset、PHAssetResource

PHAsset

PHAsset 記錄著一張照片/影片的各項資訊,像是建立時間、變動時間、媒體型態、拍攝位置、收藏狀態等

讓我們一起來看一下 PHAsset 究竟記錄著哪些資訊

@available(iOS 8, *)
open class PHAsset : PHObject {

    // enum,顯示媒體給使用者的方式
    @available(iOS 11, *)
    open var playbackStyle: PHAsset.PlaybackStyle { get } 

    // enum,媒體種類
    @available(iOS 8, *)
    open var mediaType: PHAssetMediaType { get } 

    // enum,媒體子種類
    @available(iOS 8, *)
    open var mediaSubtypes: PHAssetMediaSubtype { get } 

    // 媒體的寬度
    @available(iOS 8, *)
    open var pixelWidth: Int { get } 

    // 媒體的高度
    @available(iOS 8, *)
    open var pixelHeight: Int { get } 

    // 媒體的建立時間
    @available(iOS 8, *)
    open var creationDate: Date? { get } 

    // 媒體的變動時間
    @available(iOS 8, *)
    open var modificationDate: Date? { get } 
    
    // 拍攝媒體的位置
    @available(iOS 8, *)
    open var location: CLLocation? { get }
    
    // 影片媒體的時間長度
    @available(iOS 8, *)
    open var duration: TimeInterval { get } 

    // 媒體是否隱藏
    @available(iOS 8, *)
    open var isHidden: Bool { get } 

    // 媒體是否收藏
    @available(iOS 8, *)
    open var isFavorite: Bool { get } 

    // 連拍照片的標示符
    @available(iOS 8, *)
    open var burstIdentifier: String? { get } 

    // enum,連拍照片的種類
    @available(iOS 8, *)
    open var burstSelectionTypes: PHAssetBurstSelectionType { get } 

    // 是否為連拍照片的代表性照片
    @available(iOS 8, *)
    open var representsBurst: Bool { get } 

    // enum,媒體來源種類
    @available(iOS 9, *)
    open var sourceType: PHAssetSourceType { get } 

    // 調整格式的標示符
    @available(iOS 15, *)
    unowned(unsafe) open var adjustmentFormatIdentifier: NSString? { get } 

    @available(iOS 8, *)
    open func canPerform(_ editOperation: PHAssetEditOperation) -> Bool

    @available(iOS 8, *)
    open class func fetchAssets(in assetCollection: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset>

    @available(iOS 8, *)
    open class func fetchAssets(withLocalIdentifiers identifiers: [String], options: PHFetchOptions?) -> PHFetchResult<PHAsset>

    @available(iOS 8, *)
    open class func fetchKeyAssets(in assetCollection: PHAssetCollection, options: PHFetchOptions?) -> PHFetchResult<PHAsset>?

    @available(iOS 8, *)
    open class func fetchAssets(withBurstIdentifier burstIdentifier: String, options: PHFetchOptions?) -> PHFetchResult<PHAsset>

    @available(iOS 8, *)
    open class func fetchAssets(with options: PHFetchOptions?) -> PHFetchResult<PHAsset>

    @available(iOS 8, *)
    open class func fetchAssets(with mediaType: PHAssetMediaType, options: PHFetchOptions?) -> PHFetchResult<PHAsset>
}

PHAsset.PlaybackStyle

PHAsset.PlaybackStyle:顯示媒體給使用者的方式

@available(iOS 11, iOS 8, *)
public enum PlaybackStyle : Int {

    // 不支援或是未定義的媒體類型
    @available(iOS 8, *)
    case unsupported = 0

    // 照片
    @available(iOS 8, *)
    case image = 1

    // 動畫圖片
    @available(iOS 8, *)
    case imageAnimated = 2

    // 原況照片
    @available(iOS 8, *)
    case livePhoto = 3

    // 影片
    @available(iOS 8, *)
    case video = 4

    // 循環播放的影片
    @available(iOS 8, *)
    case videoLooping = 5
}

PHAssetMediaType

PHAssetMediaType:媒體種類

@available(iOS 8, iOS 8, *)
public enum PHAssetMediaType : Int {

    // 未知
    @available(iOS 8, *)
    case unknown = 0

    // 照片
    @available(iOS 8, *)
    case image = 1

    // 影片
    @available(iOS 8, *)
    case video = 2

    // 音檔
    @available(iOS 8, *)
    case audio = 3
}

PHAssetMediaSubtype

PHAssetMediaSubtype:媒體子種類

@available(iOS 8, iOS 8, *)
public struct PHAssetMediaSubtype : OptionSet {

    public init(rawValue: UInt)

    // 照片子類別
    
    // 全景照片
    @available(iOS 8, *)
    public static var photoPanorama: PHAssetMediaSubtype { get } 

    // HDR 照片
    @available(iOS 8, *)
    public static var photoHDR: PHAssetMediaSubtype { get } 

    // 螢幕截圖
    @available(iOS 9, *)
    public static var photoScreenshot: PHAssetMediaSubtype { get } 

    // 原況照片
    @available(iOS 9.1, *)
    public static var photoLive: PHAssetMediaSubtype { get } 

    // 人像模式照片
    @available(iOS 10.2, *)
    public static var photoDepthEffect: PHAssetMediaSubtype { get } 
    
    // 影片子類別
    
    // 網路串流影片
    @available(iOS 8, *)
    public static var videoStreamed: PHAssetMediaSubtype { get } 

    // 高幀率影片
    @available(iOS 8, *)
    public static var videoHighFrameRate: PHAssetMediaSubtype { get } 

    // 縮時影片
    @available(iOS 8, *)
    public static var videoTimelapse: PHAssetMediaSubtype { get } 
    
    // 電影模式影片
    @available(iOS 15, *)
    public static var videoCinematic: PHAssetMediaSubtype { get } 
}

PHAssetBurstSelectionType

PHAssetBurstSelectionType:連拍照片的種類

@available(iOS 8, iOS 8, *)
public struct PHAssetBurstSelectionType : OptionSet {

    public init(rawValue: UInt)

    // 系統自動選擇的
    @available(iOS 8, *)
    public static var autoPick: PHAssetBurstSelectionType { get }

    // 使用者自己選擇的
    @available(iOS 8, *)
    public static var userPick: PHAssetBurstSelectionType { get }
}

PHAssetResource

PHAssetResource 是在 Photo Library 中的底層資料,與 PHAsset 是相互關聯的

@available(iOS 9, *)
open class PHAssetResource : NSObject {

    // 媒體資源種類
    @available(iOS 9, *)
    open var type: PHAssetResourceType { get }

    // 系統為本地資產對象關聯的唯一標識符
    @available(iOS 9, *)
    open var assetLocalIdentifier: String { get }

    // 照片或影片資料的統一類型標識符
    @available(iOS 9, *)
    open var uniformTypeIdentifier: String { get }

    // 建立或是匯入時的原始檔名
    @available(iOS 9, *)
    open var originalFilename: String { get }

    @available(iOS 9, *)
    open class func assetResources(for asset: PHAsset) -> [PHAssetResource]

    @available(iOS 9.1, *)
    open class func assetResources(for livePhoto: PHLivePhoto) -> [PHAssetResource]
}

PHAssetResourceType

@available(iOS 9, iOS 8, *)
public enum PHAssetResourceType : Int {

    // 原始照片 (未修改過的)
    @available(iOS 8, *)
    case photo = 1

    // 原始影片 (未修改過的)
    @available(iOS 8, *)
    case video = 2

    // 原始音檔 (未修改過的)
    @available(iOS 8, *)
    case audio = 3

    // 非主要的照片 
    // Ex:其他相機傳來的照片,可能同時具有 JPEG 跟 RAW 檔
    // JPEG 為主要照片,RAW 為備用照片
    @available(iOS 8, *)
    case alternatePhoto = 4

    // 原始照片 (修改過的)
    @available(iOS 8, *)
    case fullSizePhoto = 5

    // 原始影片 (修改過的)
    @available(iOS 8, *)
    case fullSizeVideo = 6

    // 紀錄編輯時的資料
    @available(iOS 8, *)
    case adjustmentData = 7

    // 未更改的照片,用來回復最近的編輯狀態
    @available(iOS 8, *)
    case adjustmentBasePhoto = 8

    // 原況照片 (未修改過的)
    @available(iOS 9.1, *)
    case pairedVideo = 9

    // 原況照片 (修改過的)
    @available(iOS 10, *)
    case fullSizePairedVideo = 10

    // 未更改的原況照片,用來回復最近的編輯狀態
    @available(iOS 10, *)
    case adjustmentBasePairedVideo = 11

    // 未更改的影片,用來回復最近的編輯狀態
    @available(iOS 13, *)
    case adjustmentBaseVideo = 12
}

下一篇,再來介紹要如何應用~

參考資料

https://developer.apple.com/documentation/photokit
https://www.jianshu.com/p/3ac116ffffcc


上一篇
【在 iOS 開發路上的大小事2-Day13】PhotoKit 好像很好玩 (2)
下一篇
【在 iOS 開發路上的大小事2-Day15】PhotoKit 好像很好玩 (4)
系列文
在 iOS 開發路上的大小事230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言