2015-08-24 8 views
5

Sto lavorando con lo ALAssetLibrary per ottenere le immagini dal mio rullino fotografico per una vista personalizzata che sto creando. Facendolo era piuttosto semplice:Come ottenere un'immagine a bassa risoluzione o Miniatura da ALAssetRepresentation in Swift

library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: { 
     (group: ALAssetsGroup?, stop: UnsafeMutablePointer<ObjCBool>) in 
     if group != nil { 
      group!.setAssetsFilter(ALAssetsFilter.allPhotos()) 
      var indexSet = NSIndexSet(indexesInRange: NSMakeRange(0, group!.numberOfAssets() - 1)) 
      group!.enumerateAssetsAtIndexes(indexSet, options: nil, usingBlock: { 
       (result: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) in 
       if (result != nil) { 
        var alAssetRapresentation: ALAssetRepresentation = result.defaultRepresentation() 
        var url = alAssetRapresentation.url() 
        var iRef = alAssetRapresentation.fullResolutionImage().takeUnretainedValue() 
        var image = UIImage(CGImage: iRef) 
       } 
      }) 
     } 
     }) { (NSError) -> Void in 
    } 

Tutto questo funziona perfettamente nel simulatore. Tuttavia su un dispositivo, ottenere il fullResolutionImage() risulta essere un modo per intensificare la memoria sul dispositivo e causare arresti anomali. Ho capito che ha perfettamente senso, dozzine di immagini ad alta risoluzione caricate in memoria è una pessima idea, quindi mi piacerebbe ridimensionare la qualità e mostrare solo la miniatura dell'immagine. L'unico problema è che non esiste un modo semplice per trovare una miniatura da AlAssetRepresentation.

Sto provando a lavorare con lo CGImageSourceCreateThumbnailAtIndex per creare una miniatura ma sono stato molto confuso su come farlo.

Qualsiasi aiuto è molto apprezzato!

risposta

4

Ecco un esempio (ci potrebbero essere alcuni problemi minori di compilazione, a seconda di quale versione di Swift si sta utilizzando):

let src = CGImageSourceCreateWithURL(url, nil) 
let scale = UIScreen.mainScreen().scale 
let w = // desired display width, multiplied by scale 
let d : [NSObject:AnyObject] = [ 
    kCGImageSourceShouldAllowFloat : true, 
    kCGImageSourceCreateThumbnailWithTransform : true, 
    kCGImageSourceCreateThumbnailFromImageAlways : true, 
    kCGImageSourceThumbnailMaxPixelSize : w 
] 
let imref = CGImageSourceCreateThumbnailAtIndex(src, 0, d) 
let im = UIImage(CGImage: imref, scale: scale, orientation: .Up)! 

Tuttavia, tenere presente che non si dovrebbe usare ALAssetsLibrary più. È deprecato in iOS 9. Passa a Photo Kit e benvenuto nel mondo moderno! Ora è possibile chiamare PHImageManager.defaultManager().requestImageForAsset, che consente di fornire un targetSize per l'immagine desiderata.

+0

Bello! Quindi PhotoKit è quello che dovrei usare: D – Unome

+0

Assolutamente. Il tuo desiderio di caricare l'immagine con le dimensioni ridotte è lodevole, e CGImageSourceCreateThumbnailAtIndex è un ottimo modo per farlo, ma in questa situazione non devi farlo; Photo Kit si prende cura di tutto ciò che fa per te. – matt

+0

Fantastico. Userò PhotoKit quindi, Thx! + 1 C'è qualche buon materiale su come enumerare le foto degli utenti usando PhotoKit a cui mi puoi indirizzare? Ecco dove sono adesso. – Unome

Problemi correlati