2014-10-30 5 views
9

Ich habe gründlich gelesen, die neuesten iOS8 Fotorahmen Arbeit und ich versuche, einige Assets aus der Benutzer-Bibliothek zur Anzeige zu holen. Ich lasse den Benutzer 4 Bilder gleichzeitig bearbeiten. Aus diesem Grund muss ich die Bilder komprimieren, sonst stürzt die App ab.UIImage Größe von 'requestImageForAsset' ist nicht einmal in der Nähe der 'targetSize' Einstellung

ich PHImageManager bin mit den Bildern über den folgenden Code zu laden:

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)") 
      } 

     } 

    } 

Wie Sie sehen können, habe ich die Zielgröße an Berechnung des Bild ist zumindest nicht größer als der Bildschirm, um sicherzustellen. Wenn ja, verkleinere ich das Verhältnis auf dem Bild. Doch hier ist ein typisches Druckprotokoll

Zielgröße (768.0,798.453531598513) Ergebnis Größe ist (1614.0,1678.0)

Auch wenn ich die Zielgröße 768x798 bin Einstellung (in diesem spezifischen Fall) die resultierende UIImage, die es mir gibt, ist mehr als das Doppelte. Jetzt gemäß der Dokumentation, der targetSize-Parameter

"Die Zielgröße des Bildes zurückgegeben werden."

Nicht die klarste Erklärung, aber aus meinen Experimenten ist es nicht mit diesem übereinstimmt.

Wenn Sie einige Vorschläge haben, würde ich es gerne hören!

Antwort

3

Versuchen Sie, den resizeMode auf PHImageRequestOptionsResizeModeExact und deliveryMode auf PHImageRequestOptionsDeliveryModeHighQualityFormat zu setzen;

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

In Swift, wollen Sie so etwas wie dies zu tun:

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)") 

}

In Objective-C, sieht es so etwas wie dieses:

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]; 

Wichtiger Hinweis : Mit der Opportunistic Liefermodus, der Ergebnisblock kann mehr als einmal mit verschiedenen Größen aufgerufen werden, aber der letzte Anruf wird die gewünschte Größe sein. Es ist besser Opportunistic zu verwenden, damit die Benutzeroberfläche zuerst einen Platzhalter niedriger Qualität lädt und dann aktualisiert, da das Betriebssystem ein besseres Bild erstellen kann (anstatt ein leeres Quadrat zu haben).

3

Dies ist, weil requestImageForAsset zweimal aufgerufen wird.

Das erste Mal, wird es ein Bild der gleichen Größe, wie (60 * 45), die ich denke, ist das Thumbnail des Bildes.

Das zweite Mal erhalten Sie das Bild in voller Größe.

Ich benutze

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

die beiden unterschiedlichen Bilder zu unterscheiden.

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

+0

Vielen Dank für diesen (resizeMode wird ignoriert). Ich habe das Bildresultat von 'requestImageForAsset' an eine andere Klasse delegiert und es hat sich deswegen schlecht benommen. – Christopher

3

Sie PHImageManagerMaximumSize als targetSize für eine PHImageManager Anfrage nutzen können.

Nach dem docs in PHImageManagerMaximumSize: Größe zu übergeben, wenn das Originalbild anfordert oder die größte verfügbare gerenderten Bild