2014-10-30 21 views
9

我已經仔細閱讀了最新的iOS8相框工作,並試圖從用戶庫中獲取一些資產以顯示。我讓用戶一次編輯4個圖像。但正因爲如此,我需要壓縮圖像,否則應用程序將崩潰。從'requestImageForAsset'返回的UIImage大小甚至沒有接近'targetSize'設置

我使用的是PHImageManager通過下面的代碼加載圖像:

func processImages() 
    { 
     println("Processing") 
     _selectediImages = Array() 
     _cacheImageComplete = 0 
     for asset in _selectedAssets 
     { 
      var options:PHImageRequestOptions = PHImageRequestOptions() 
      options.version = PHImageRequestOptionsVersion.Unadjusted 
      options.synchronous = true 
      var minRatio:CGFloat = 1 
      if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height) 
      { 
       minRatio = min(UIScreen.mainScreen().bounds.width/(CGFloat(asset.pixelWidth)), (UIScreen.mainScreen().bounds.height/CGFloat(asset.pixelHeight))) 
      } 
      var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio)) 
      println("Target size is \(size)") 
      PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:size, contentMode: .AspectFill, options: options) 
       { 
        uiimageResult, info in 
        var image = iImage(uiimage: uiimageResult) 
        println("Result Size Is \(uiimageResult.size)") 
      } 

     } 

    } 

正如你所看到的,我計算出目標的大小,以確保圖像是至少沒有比屏幕大。如果是這樣,我會在圖像上縮小比例。但是這裏是一個典型的打印日誌

目標尺寸爲(768.0,798.453531598513) 結果大小爲(1614.0,1678.0)

即使我設定目標尺寸768x798(在特定的情況下)它給我的結果UIImage超過了兩倍。根據文檔,目標大小參數

「要返回的圖像的目標大小。」

不是最清楚的解釋,但從我的實驗它不符合這一點。

如果您有一些建議,我很樂意聽到它!

回答

3

嘗試將resizeMode設置爲PHImageRequestOptionsResizeModeExact,並將deliveryMode設置爲PHImageRequestOptionsDeliveryModeHighQualityFormat;

PHImageRequestOptionsResizeModeExact, 
// same as above but also guarantees the delivered image is exactly targetSize (must be set when a normalizedCropRect is specified) 
5

Swift,你想要做這樣的事情:

var asset: PHAsset! 
var imageSize = CGSize(width: 100, height: 100) 

var options = PHImageRequestOptions() 
options.resizeMode = PHImageRequestOptionsResizeMode.Exact 
options.deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic 

PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: imageSize, contentMode: PHImageContentMode.AspectFill, options: options) { 
    (image, info) -> Void in 
    // what you want to do with the image here 
    var image = iImage(uiimage: uiimageResult) 
    println("Result Size Is \(uiimageResult.size)") 

}

Objective-C,它看起來是這樣的:

void (^resultHandler)(UIImage *, NSDictionary *) = ^(UIImage *result, NSDictionary *info) { 
    // what you want to do with the image 

}; 

CGSize cellSize = CGSizeMake(100, 100); 

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 
options.resizeMode = PHImageRequestOptionsResizeModeExact; 
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic; 

[[PHImageManager defaultManager] requestImageForAsset:self.imageAsset targetSize:cellSize contentMode:PHImageContentModeAspectFill options:options resultHandler:resultHandler]; 

重要提示 :與機會主義交付模式,結果塊可能會以不同的尺寸被調用一次以上,但最後的調用將是您想要的尺寸。最好使用Opportunistic,這樣UI將首先加載低質量的佔位符,然後更新它,因爲操作系統可以生成更好的圖像(而不是空白方塊)。

3

這是因爲requestImageForAsset將被調用兩次。

第一次,它會返回一個非常大小的圖像,例如(60 * 45),我認爲它是該圖像的縮略圖。

第二次,你會得到全尺寸的圖像。

我使用

if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){ // Do something with the FULL SIZED image } else { // Do something with the regraded image }

區分兩個不同的圖像。

參考:iOS 8 PhotoKit. Get maximum-size image from iCloud Photo Sharing albums

+0

感謝這個傳遞。我正在將'requestImageForAsset'的圖像結果委託給另一個類,由於這個原因,這是行爲不端。 – Christopher 2015-12-15 02:29:02

3

您可以使用PHImageManagerMaximumSize作爲targetSizePHImageManager請求。

根據PHImageManagerMaximumSize文檔: 尺寸到請求時,原始圖像或最大渲染圖像可用(resizeMode將被忽略)

相關問題