2015-07-31 10 views
6

Sto caricando le immagini dal rullino fotografico tramite PHImageManager, ma le immagini restituite non sono la risoluzione retina. Devo fornire un moltiplicatore me stesso per 2x e 3x o ho qualcosa di sbagliato?PHImageManager restituisce le immagini in pixel o in punti per schermi 2x e 3x?

Ecco il mio codice:

class ReviewableImageView: UIImageView { 

    ...unrelated code 

    imageRequestOptions = PHImageRequestOptions() 
    imageRequestOptions.deliveryMode = .HighQualityFormat 
    imageRequestOptions.resizeMode = .Exact 

    ...unrelated code 

    self.contentMode = .ScaleAspectFit 
    self.backgroundColor = UIColor.clearColor() 
    self.userInteractionEnabled = true 

    ... unrelated code 

    func reloadImage(){ 
     let imageManager = PHCachingImageManager()//PHImageManager() 

     imageManager.requestImageForAsset(self.imageAsset, 
      targetSize: self.frame.size, 
      contentMode: .AspectFit, 
      options: imageRequestOptions, 
      resultHandler: { (image: UIImage!, info: [NSObject : AnyObject]!) in 
       self.image = image 
     }) 
    } 

} 

risposta

3

E 'difficile dire dal codice se vi rendete conto che il resultHandler sarà chiamato più volte. Il prima è chiamato, è possibile ottenere un'immagine di bassa qualità a bassa risoluzione. Ma alla fine verrà chiamato con un'immagine correttamente ridimensionata.

+3

In realtà, credo perché sta usando 'deliveryMode = .HighQualityFormat' che sarà solo l'alto immagine di qualità, e 'resultHandler' sparerà solo una volta per immagine. [Da doc] (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHImageRequestOptions_Class/index.html#//apple_ref/c/tdef/PHImageRequestOptionsDeliveryMode) – Individual11

4

Secondo i miei esperimenti con PHImageManager è necessario fornire un targetSize in pixel. Ad esempio, immagina di voler richiedere un'immagine con la dimensione 400x800 px. Per questo caso è possibile impostare la dimensione di destinazione come il seguente:

// Set target size. 
let targetSize = CGSizeMake(400, 800) 

quanto riguarda il tuo esempio di codice, nel Apple's docs ha affermato che:

Le coordinate del rettangolo cornice sono sempre di cui ai punti.

Quindi, per impostare il formato di destinazione corretto in questo caso è possibile utilizzare il codice simile al seguente:

// Get scale factor associated with the screen. 
let scale = UIScreen.mainScreen().scale 

// Request the image. 
imageManager.requestImageForAsset(self.imageAsset, 
      targetSize: CGSizeMake(self.frame.size.width * scale, self.frame.size.height * scale), 
      contentMode: .AspectFit, 
      options: imageRequestOptions, 
      resultHandler: { (image, info) -> Void in 
       // Handle the result here... 
     }) 
+0

Ho anche provato e trovato che requestImageForAsset restituisce un'immagine con una scala di 1.0, quindi vorresti specificare i pixel per targetSize. – Joel

Problemi correlati