簡體   English   中英

確定iOS設備上可用的最大PHAsset圖像大小

[英]Determine largest PHAsset image size available on iOS device

如何確定iOS設備上可用的最大PHAsset圖像大小,其中“可用”我的意思是當前在設備上,不需要從iCloud照片庫進行任何網絡下載?

我一直在開發一個應用程序,其中縮略圖的集合顯示在UICollectionView (很像照片應用程序),然后用戶可以選擇圖像以查看它的完整大小。 如有必要,可從iCloud下載完整大小的圖像。 但是,我希望向用戶顯示圖像的最大版本,直到完整大小可用。

Photos Framework的工作方式相當奇怪:

在集合視圖,我使用PHCachingImageManager高速緩存 (后來請求 )圖像具有targetSize的186x186像素(雙倍UICollectionViewCell因為視網膜縮放的尺寸)。

這非常有效,滾動非常快,並且在用圖像填充單元格時沒有延遲。 檢查返回圖像的大小,它們大約是342x256像素。 這是在我的iPhone 6上啟用了iCloud Photo Library並啟用了“優化存儲”,因此大多數圖像只能在設備上存儲小的縮略圖。

然而,奇怪的是,如果我然后使用PHImageRequestOptionsDeliveryMode.Opportunistic選項使用PHCachingImageManagerPHImageManager.defaultManager()請求任何圖像的完整大小(或更大)版本,則返回第一個(低質量)圖像是一個60x45像素的小郵票,在整個屏幕上看起來很糟糕,直到最終下載完整尺寸的圖像來替換它。

顯然,在設備上較大的縮略圖(342x256)已經,因為他們是在集合視圖只是顯示! 那么為什么地獄不會將它們作為第一個“低質量”圖像返回,直到下載完整尺寸? 為了確保342x256圖像確實已經在設備上,我在飛行模式下運行代碼,因此沒有發生網絡訪問。

我發現如果我要求任何大小高達256x256我會得到342x256圖像返回。 一旦我變大(甚至1個像素),它將首先返回60x45圖像然后嘗試下載全尺寸圖像。

我已經更改了我的代碼以首先發出256x256請求,然后使用PHImageRequestOptionsDeliveryMode.HighQualityFormat (它不會返回一個微小的中間圖像)的完整大小請求,並且它工作得非常好。 這也是iOS Photos應用程序必須要做的事情,因為它在下載完整圖像時顯示相對高質量的縮略圖。

那么,在這樣的背景下,我怎么知道PHAsset上設備圖像尺寸最大的是什么? 256x256是一個神奇的數字,還是取決於iCloud Photo Library如何優化空間(基於庫的大小和可用的設備存儲)?

當然,似乎是一個錯誤,照片框架沒有返回當前可用的最大圖像(當要求的尺寸大於目前的尺寸),並且要獲得它擁有的最大尺寸,你必須要求這個尺寸或更小,因為如果你要求更大,你將獲得60x45的縮影! 離奇。

更新:提交給Apple的錯誤報告: https//openradar.appspot.com/25181601
演示該錯誤的示例項目: https//github.com/mluisbrown/PhotoKitBug

使用問題中發布的示例項目,我能夠在模擬器中重現該問題,但是當我進行以下更改時,我只會收到最大的圖像:

let targetSize = PHImageManagerMaximumSize

實際上我不知道蘋果會用PHImageResultIsDegradedKey = 1返回降級的45 * 60圖像的原因。 對我來說,我只是首先使用deliveryMode PHImageRequestOptionsDeliveryModeHighQualityFormat請求256 * 256圖像,然后我使用其他PHImageRequestOptions來請求完整大小的圖像,如下所示:

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){
// code to update the iCloud download progress
});

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// code to update UIImageView or something else.
});

我認為,Instagram可能會使用這種類似的解決方案來處理來自iCloud的圖像。

[imageManager requestImageForAsset:asset
              targetSize: PHImageManagerMaximumSize
              contentMode:PHImageContentModeAspectFill
              options:nil
resultHandler:^(UIImage *result, NSDictionary *info)
{
    result;
}];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM