2015-08-24 12 views
5

Ich arbeite mit der ALAssetLibrary, um die Bilder von meiner Kamera roll für eine benutzerdefinierte Ansicht, die ich mache. Dies war ziemlich einfach:Wie bekomme ich ein Bild mit niedriger Auflösung, oder Thumbnail von der 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 
    } 

All dies funktioniert gut im Simulator. Jedoch auf einem Gerät, das fullResolutionImage() zu bekommen, erweist sich als Weg zu speicherintensiv auf dem Gerät und verursacht Abstürze. Ich fand, das macht Sinn, Dutzende von hochauflösenden Bildern, die alle in den Speicher geladen werden, sind eine schreckliche Idee, also würde ich gerne die Qualität zurück skalieren und nur das Miniaturbild des Bildes zeigen. Einziges Problem ist, dass es keine einfache Möglichkeit gibt, ein Thumbnail von der AlAssetRepresentation zu bekommen.

Ich versuche mit der CGImageSourceCreateThumbnailAtIndex zu arbeiten, um ein Thumbnail zu erstellen, war aber sehr verwirrt, wie man das macht.

Jede Hilfe wird sehr geschätzt!

Antwort

4

Hier ist ein Beispiel (es könnte einige kleinere Kompilierung Probleme sein, je nachdem, welche Version von Swift Sie verwenden):

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

Beachten Sie jedoch, dass Sie nicht ALAssetsLibrary nicht mehr verwenden sollten. Es ist in iOS 9 veraltet. Wechseln Sie zu Photo Kit, und willkommen in der modernen Welt! Jetzt können Sie PHImageManager.defaultManager().requestImageForAsset anrufen, die Ihnen ermöglicht, ein targetSize für das gewünschte Bild zu liefern.

+0

Schön! Also PhotoKit soll ich verwenden: D – Unome

+0

Absolut. Ihr Wunsch, das Bild in der reduzierten Größe zu laden, ist lobenswert, und CGImageSourceCreateThumbnailAtIndex ist ein guter Weg, dies zu tun, aber in dieser Situation müssen Sie das nicht tun; Photo Kit kümmert sich um das Ganze für Sie. – matt

+0

Fantastisch. Ich werde dann PhotoKit verwenden, Thx! + 1 Gibt es gutes Material zum Aufzählen der Benutzerfotos mit PhotoKit, auf das Sie mich verweisen können? Das ist, wo ich jetzt bin. – Unome