PhotoKit 照片庫的管理-獲取圖像

 
 

PHAsset部分屬性解析

  1、HDR 和全景照片

  mediaSubtypes?屬性驗證資源庫中的圖像在捕捉時是否開啟了 HDR,拍攝時是否使用了相機應用的全景模式。

  2、收藏和隱藏資源

  要驗證一個資源是否被用戶標記為收藏或被隱藏,只要檢查?PHAsset?實例的?favorite??hidden?屬性即可。

  3、連拍模式照片

  對于一個資源,如果其?PHAsset??representsBurst?屬性為?true,則表示這個資源是一系列連拍照片中的代表照片 (多張照片是在用戶按住快門時拍攝的)。它還有一個屬性是?burstIdentifier,如果想要獲取連拍照片中的剩余的其他照片,可以通過將這個值傳入?fetchAssetsWithBurstIdentifier(...)?方法來獲取。

  用戶可以在連拍的照片中做標記;此外,系統也會自動用各種試探來標記用戶可能會選擇的潛在代表照片。這個元數據是可以通過PHAsset??burstSelectionTypes?屬性來訪問。這個屬性是用三個常量組成的位掩碼:.UserPick?表示用戶手動標記的資源,.AutoPick?表示用戶可能標記的潛在資源,.None?表示沒有標記的資源。

?

獲取圖像

static PHImageRequestOptions *requestOptions; 
if (!requestOptions) { requestOptions = [[PHImageRequestOptions alloc] init]; requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic; requestOptions.resizeMode = PHImageRequestOptionsResizeModeFast; } photoCell.requestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(CGRectGetWidth(photoCell.thumbView.frame) ,CGRectGetHeight(photoCell.thumbView.frame) ) contentMode:PHImageContentModeAspectFill options:requestOptions resultHandler:^(UIImage *result, NSDictionary *info) { photoCell.thumbView.image = result; }];

  1、PHImageRequestOptions類用于定制請求。

  上面的方法返回指定尺寸的圖像,如果你僅僅指定必要的參數而沒有對 options 進行配置的話,返回的圖像尺寸將會是原始圖像的尺寸。或者,你指定的尺寸很小,這時候會按照你的要求來返回接近該尺寸的圖像。PHImageRequestOptions有以下幾個重要的屬性:

    synchronous:指定請求是否同步執行。 默認為 NO,如果?synchronous 為 YES,即同步請求時,deliveryMode 會被視為 PHImageRequestOptionsDeliveryModeHighQualityFormat,即自動返回高質量的圖片,因此不建議使用同步請求,否則如果界面需要等待返回的圖像才能進一步作出反應,則反應時長會很長。

    resizeMode:對請求的圖像怎樣縮放。有三種選擇:None,不縮放;Fast,盡快地提供接近或稍微大于要求的尺寸;Exact,精準提供要求的尺寸。(resizeMode 默認是 None,這也造成了返回圖像尺寸與要求尺寸不符。這點需要注意。要返回一個指定尺寸的圖像需要避免兩層陷阱:一定要指定 options 參數,resizeMode 不能為 None。

    deliveryMode:圖像質量。有三種值:Opportunistic,在速度與質量中均衡;HighQualityFormat,不管花費多長時間,提供高質量圖像;FastFormat,以最快速度提供好的質量。這個屬性只有在 synchronous 為 true 時有效。

    normalizedCropRect:用于對原始尺寸的圖像進行裁剪,基于比例坐標。只在 resizeMode 為 Exact 時有效。

    networkAccessAllowed :參數控制是否允許網絡請求,默認為 NO,如果不允許網絡請求,那么就沒有然后了,當然也拉取不到 iCloud 的圖像原件。(在 PhotoKit 中,對 iCloud 照片庫有很好的支持,如果用戶開啟了 iCloud 照片庫,并且選擇了“優化 iPhone/iPad 儲存空間”,或者選擇了“下載并保留原件”但原件還沒有加載好的時候,PhotoKit 也會預先拿到這些非本地圖像的 PHAsset,但是由于本地并沒有原圖,所以如果產生了請求高清圖的請求,PHotoKit 會嘗試從 iCloud 下載圖片,而這個行為最終的表現,會被?PHImageRequestOptions 中的值所影響。)

    versions:這個屬性是指獲取的圖像是否需要包含系統相冊“編輯”功能處理過的信息(如濾鏡,旋轉等);

     ?    .Current 會遞送包含所有調整和修改的圖像;.Unadjusted 會遞送未被施加任何修改的圖像;.Original 會遞送原始的、最高質量的格式的圖像 (例如 RAW 格式的數據。而當將屬性設置為 .Unadjusted 時,會遞送一個 JPEG)。

?

  2、progressHandler

  還有一個與 iCloud 密切相關的屬性?progressHandler,當圖像需要從 iCloud 下載時,這個 block 會被自動調用,block 中會返回圖像下載的進度,圖像的信息,出錯信息。開發者可以利用這些信息反饋給用戶當前圖像的下載進度以及狀況,但需要注意?progressHandler 不在主線程上執行,因此在其中需要操作 UI,則需要手工放到主線程執行。

requestImageForAsset 中的參數?resultHandler 可能會被多次調用,這種情況就是圖像需要從 iCloud 中下載的情況。在?requestImageForAsset 返回的內容中,一開始的那一次請求中會返回一個小尺寸的圖像版本,當高清圖像還在下載時,開發者可以首先給用戶展示這個低清的圖像版本,然后 block 在多次調用后,最終會返回高清的原圖。至于當前返回的圖像是哪個版本的圖像,可以通過 block 返回的 NSDictionary info 中獲知,PHImageResultIsDegradedKey 表示當前返回的 UIImage 是低清圖。如果需要判斷是否已經獲得高清圖,可以這樣判斷:

 
// 排除取消,錯誤,低清圖三種情況,即已經獲取到了高清圖
 
BOOL downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey] && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue];
3、info 字典提供了關于當前請求狀態的信息,比如:

圖像是否必須從 iCloud 請求 (如果你初始化時將 networkAccessAllowed 設置成 false,那么就必須重新請求圖像) —— PHImageResultIsInCloudKey 。

當前遞送的 UIImage 是否是最終結果的低質量格式。當高質量圖像正在下載時,這個可以讓你給用戶先展示一個預覽圖—PHImageResultIsDegradedKey。

請求 ID (可以便捷的取消請求),以及請求是否已經被取消 —— PHImageResultRequestIDKey 和 PHImageCancelledKey。

如果沒有圖像提供給 result handler,字典內還會有一個錯誤信息 —PHImageErrorKey。

這些值可以讓你更新你的 UI 來告知用戶,和上面討論到的 progressHandler 一起,來表示出它們的加載狀態。

取消獲取圖像(icode下載)
[[PHImageManager defaultManager] cancelImageRequest:(PHImageRequestID)photoCell.requestID];


?

轉載于:https://www.cnblogs.com/huaixu/p/6699368.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393195.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cmail服務器安裝后無法登錄的解決辦法

安裝cmailserver 5.4.6軟件安裝、注冊都非常順利,webmail頁面也都正常打開,但是一點“登錄”就提示錯誤: Microsoft VBScript 運行時錯誤 錯誤 800a01ad ActiveX 部件不能創建對象: CMailCOM.POP3.1 /mail/login.asp,行 42 點“…

matlab對人工智能,MATLAB與人工智能深度學習和機器學習.PDF

MATLAB與人工智能深度學習和機器學習MATLAB 與人工智能:深度學習有多遠?© 2017 The MathWorks, Inc.1機器學習8機器學習無處不在? 圖像識別 [TBD]? 語音識別? 股票預測? 醫療診斷? 數據分析? 機器人? 更多……9什么是機器學習?機…

leetcode1471. 數組中的 k 個最強值(排序)

給你一個整數數組 arr 和一個整數 k 。 設 m 為數組的中位數,只要滿足下述兩個前提之一,就可以判定 arr[i] 的值比 arr[j] 的值更強: |arr[i] - m| > |arr[j] - m| |arr[i] - m| |arr[j] - m|,且 arr[i] > arr[j] 請返回…

Spring中WebApplicationInitializer的理解

現在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一個接口。通過實現WebApplicationInitializer,在其中可以添加servlet,listener等,在加載Web項目的時候會加載這個接口實…

使用fetch封裝請求_關于如何使用Fetch API執行HTTP請求的實用ES6指南

使用fetch封裝請求In this guide, I’ll show you how to use the Fetch API (ES6) to perform HTTP requests to an REST API with some practical examples you’ll most likely encounter.在本指南中,我將向您展示如何使用Fetch API(ES6 )來執行對REST API的 HTT…

hadoop集群中客戶端修改、刪除文件失敗

這是因為hadoop集群在啟動時自動進入安全模式 查看安全模式狀態:hadoop fs –safemode get 進入安全模式狀態:hadoop fs –safemode enter 退出安全模式狀態:hadoop fs –safemode leave轉載于:https://www.cnblogs.com/lishengnan/p/a123.ht…

OpenStack nova-network 支持多vlan技術實現片段代碼

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

Rest API

什么是接口測試 接口測試又稱 API 測試 Application Programming Interface 接口測試是測試系統組件間接口的一種測試。重點關注數據傳遞。 接口測試一般會用于多系統間交互開發,或者擁有多個子系統的應用系統開發的測試。 為什么要做接口測試 很多系統關聯都是基于…

php循環checkbox,php循環刪除checkbox | 學步園

一、首先要了解sql語句$SQLdelete from user where id in (1,2,4);表單大概是:form action methodpost input nameID_Dele[] typecheckbox idID_Dele[] value1input nameID_Dele[] typecheckbox idID_Dele[] value2input nameID_Dele[] type首先要了解sql語句$SQL&q…

leetcode1451. 重新排列句子中的單詞(排序)

「句子」是一個用空格分隔單詞的字符串。給你一個滿足下述格式的句子 text : 句子的首字母大寫 text 中的每個單詞都用單個空格分隔。 請你重新排列 text 中的單詞,使所有單詞按其長度的升序排列。如果兩個單詞的長度相同,則保留其在原句子中的相對順序…

Java+Oracle實現事務——JDBC事務

J2EE支持JDBC事務、JTA事務和容器事務事務,這里說一下怎樣實現JDBC事務。 JDBC事務是由Connection對象所控制的,它提供了兩種事務模式:自己主動提交和手動提交,默認是自己主動提交。 自己主動提交就是:在JDBC中。在一個…

開源項目貢獻者_我如何從一名貢獻者轉變為一個開源項目維護者

開源項目貢獻者by Dhanraj Acharya通過Dhanraj Acharya 我如何從一名貢獻者轉變為一個開源項目維護者 (How I went from being a contributor to an Open Source project maintainer) I was a lone software developer. When I was in college, I attended the KDE conference…

網絡攝像頭CVE

CVE-2018-9995 rtsp未授權訪問 rtsp后綴整理: Axis(安訊士) rtsp:// 192.168.200.202/axis-media/media.amp?videocodech264&resolution1280x720 rtsp://IP地址/mpeg4/media.amp rtsp://IP地址/安迅士/AXIS-media/media.amp123D-Link …

Centos中不從skel目錄里向其中復制任何文件錯誤的解決方法

[rootlocalhost www]# useradd -d /webserver/www/ ithovcom useradd:警告:此主目錄已經存在。 不從 skel 目錄里向其中復制任何文件。 [rootlocalhost www]# ls -a .&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; .. 發現沒…

leetcode91. 解碼方法

一條包含字母 A-Z 的消息通過以下方式進行了編碼: ‘A’ -> 1 ‘B’ -> 2 … ‘Z’ -> 26 給定一個只包含數字的非空字符串,請計算解碼方法的總數。 示例 1: 輸入: “12” 輸出: 2 解釋: 它可以解碼為 “AB”(1 2)或者…

php 系統平均負載,Linux_解析Linux系統的平均負載概念,一、什么是系統平均負載(Load a - phpStudy...

解析Linux系統的平均負載概念一、什么是系統平均負載(Load average)?在Linux系統中,uptime、w、top等命令都會有系統平均負載load average的輸出,那么什么是系統平均負載呢?系統平均負載被定義為在特定時間間隔內運行隊列中的平均…

Elastic-job使用及原理

一、原理 elastic-job有lite版和cloud版,最大的區別是有無調度中心,筆者采用的是lite版本,無中心化。 tips: 第一臺服務器上線觸發主服務器選舉。主服務器一旦下線,則重新觸發選舉,選舉過程中阻塞,只有主服…

構建持續交付_如何使交付成為您的重點將如何幫助您構建高質量的應用程序

構建持續交付by Simon Schwartz西蒙施瓦茨(Simon Schwartz) 如何使交付成為您的重點將如何幫助您構建高質量的應用程序 (How making delivery your focus will help you build quality applications) I was recently asked by our company’s executive team why our team was…

微信退款通知,退款回調數據解密.SHA256簽名AEAD_AES_256_GCM解密

$xmlResult file_get_contents("php://input");//獲取微信的數據$result $this->xmlToArray($xmlResult);//將xml轉成數組 // 將加密的數據解密,方法在下面$reqInfo $this->refund_decrypt($result[req_info]); /** 退款通知解密* Author WangZhaoBo* param…

BeanShell自動裝箱拆箱

“裝箱”和“拆箱”是用來描述自動包裝一個原始類型到一個包裝類以及在必要時解開包裝回到原始類型的術語。裝箱是 Java 的特性(SDK 1.5)之一,且 BeanShell 已支持多年。 BeanShell 支持原始類型的裝箱和拆箱。比如: int i5; Inte…