如何从自定义相册中获取所有图像 - 快速

问题描述 投票:6回答:3

如何从自定义相册中获取所有图像?

var fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
let allImages:PHFetchResult = PHAsset.fetchKeyAssetsInAssetCollection(albumList[index].collection, options: fetchOptions)

这个代码块只取一些。谢谢。

- > albumList[index].collection的类型是PHAssetCollection

ios swift photos phasset
3个回答
13
投票

对于Swift 4

使用这个答案https://stackoverflow.com/a/28904792/4795651为自己编辑了一点。

import Photos


func fetchCustomAlbumPhotos()
{
    let albumName = "Album Name Here"
    var assetCollection = PHAssetCollection()
    var albumFound = Bool()
    var photoAssets = PHFetchResult<AnyObject>()
    let fetchOptions = PHFetchOptions()

    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

    if let firstObject = collection.firstObject{
        //found the album
        assetCollection = firstObject
        albumFound = true
    }
    else { albumFound = false }
    _ = collection.count
    photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
    let imageManager = PHCachingImageManager()
    photoAssets.enumerateObjects{(object: AnyObject!,
        count: Int,
        stop: UnsafeMutablePointer<ObjCBool>) in

        if object is PHAsset{
            let asset = object as! PHAsset
            print("Inside  If object is PHAsset, This is number 1")

            let imageSize = CGSize(width: asset.pixelWidth,
                                   height: asset.pixelHeight)

            /* For faster performance, and maybe degraded image */
            let options = PHImageRequestOptions()
            options.deliveryMode = .fastFormat
            options.isSynchronous = true

            imageManager.requestImage(for: asset,
                                              targetSize: imageSize,
                                              contentMode: .aspectFill,
                                              options: options,
                                              resultHandler: {
                                                (image, info) -> Void in
                                                self.photo = image!
                                                /* The image is now available to us */
                                                self.addImgToArray(uploadImage: self.photo!)
                                                print("enum for image, This is number 2")

            })

        }
    }
}

func addImgToArray(uploadImage:UIImage)
{
    self.images.append(uploadImage)

}

对于Swift 2.1

import Photos


func FetchCustomAlbumPhotos()
{
    var albumName = "SwiftAlbum"
    var assetCollection = PHAssetCollection()
    var albumFound = Bool()
    var photoAssets = PHFetchResult()

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)

    if let first_Obj:AnyObject = collection.firstObject{
        //found the album
        assetCollection = collection.firstObject as! PHAssetCollection
        albumFound = true
    }
    else { albumFound = false }
    var i = collection.count
    photoAssets = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: nil)
    let imageManager = PHCachingImageManager()

    //        let imageManager = PHImageManager.defaultManager()

    photoAssets.enumerateObjectsUsingBlock{(object: AnyObject!,
        count: Int,
        stop: UnsafeMutablePointer<ObjCBool>) in

        if object is PHAsset{
            let asset = object as! PHAsset
            print("Inside  If object is PHAsset, This is number 1")

            let imageSize = CGSize(width: asset.pixelWidth,
                height: asset.pixelHeight)

            /* For faster performance, and maybe degraded image */
            let options = PHImageRequestOptions()
            options.deliveryMode = .FastFormat
            options.synchronous = true

            imageManager.requestImageForAsset(asset,
                targetSize: imageSize,
                contentMode: .AspectFill,
                options: options,
                resultHandler: {
                    (image, info) -> Void in
                    self.photo = image!
                    /* The image is now available to us */
                    self.addImgToArray(self.photo)
                    print("enum for image, This is number 2")

            })

        }
    }
}

func addImgToArray(uploadImage:UIImage)
{
    self.images.append(uploadImage)

}

1
投票

这是一张自定义相册,所以您要做的就是将它添加到中间的代码中:

import Photos

class CustomPhotoAlbum {

static let albumName = "Album"
static let sharedInstance = CustomPhotoAlbum()

var assetCollection: PHAssetCollection!

init() {

    func fetchAssetCollectionForAlbum() -> PHAssetCollection! {

        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "title = %@", CustomPhotoAlbum.albumName)
        let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

        if let firstObject: AnyObject = collection.firstObject {
            return collection.firstObject as? PHAssetCollection
        }

        return nil
    }

    if let assetCollection = fetchAssetCollectionForAlbum() {
        self.assetCollection = assetCollection
        return
    }

    PHPhotoLibrary.shared().performChanges({
        PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: CustomPhotoAlbum.albumName)
    }) { success, _ in
        if success {
            self.assetCollection = fetchAssetCollectionForAlbum()
        }
    }
}

func saveImage(image: UIImage) {

    if assetCollection == nil {
        return   // If there was an error upstream, skip the save.
    }

    PHPhotoLibrary.shared().performChanges({
        let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
        let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset
        let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
        albumChangeRequest?.addAssets([assetPlaceholder] as NSFastEnumeration)
    }, completionHandler: nil)
}


}

然后,要获取相册中的所有图片,请使用以下代码:

func getAlbum(title: String, completionHandler: @escaping (PHAssetCollection?) -> ()) {
    DispatchQueue.global(qos: .background).async { [weak self] in
        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "title = %@", title)
        let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

        if let album = collections.firstObject {
            completionHandler(album)
        } else {
            self?.createAlbum(withTitle: title, completionHandler: { (album) in
                completionHandler(album)
            })
        }
    }
}

要调用此函数,请使用以下示例:

getAlbum(title: "Album") { [weak self] assetCollection in 
        guard let this = self else { return }
        guard assetCollection != nil else { return }
        print(assetCollection!)
    }

如果要创建自定义相册,请使用此功能:

 func createAlbum(withTitle title: String, completionHandler: @escaping (PHAssetCollection?) -> ()) {
    DispatchQueue.global(qos: .background).async {
        var placeholder: PHObjectPlaceholder?

        PHPhotoLibrary.shared().performChanges({
            let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: title)
            placeholder = createAlbumRequest.placeholderForCreatedAssetCollection
        }, completionHandler: { (created, error) in
            var album: PHAssetCollection?
            if created {
                let collectionFetchResult = placeholder.map { PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [$0.localIdentifier], options: nil) }
                album = collectionFetchResult?.firstObject
            }

            completionHandler(album)

        })
    }
}

如果未创建相册,则将在getAlbum中调用此函数。


0
投票

SWIFT 4

func FetchCustomAlbumPhotos()
{
    let albumName = "AlbumName"
    var assetCollection = PHAssetCollection()
    var albumFound = Bool()
    var photoAssets = PHFetchResult<AnyObject>()

    let fetchOptions = PHFetchOptions()
    fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
    let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

    if let _:AnyObject = collection.firstObject{
        //found the album
        assetCollection = collection.firstObject!
        albumFound = true
    }
    else { albumFound = false }
    _ = collection.count
    photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
    let imageManager = PHCachingImageManager()

    //        let imageManager = PHImageManager.defaultManager()

    photoAssets.enumerateObjects{(object: AnyObject!,
        count: Int,
        stop: UnsafeMutablePointer<ObjCBool>) in

        if object is PHAsset{
            let asset = object as! PHAsset
            print("Inside  If object is PHAsset, This is number 1")

            let imageSize = CGSize(width: asset.pixelWidth,
                                   height: asset.pixelHeight)

            /* For faster performance, and maybe degraded image */
            let options = PHImageRequestOptions()
            options.deliveryMode = .fastFormat
            options.isSynchronous = true

            imageManager.requestImage(for: asset,
                                              targetSize: imageSize,
                                              contentMode: .aspectFit ,
                                              options: options,
                                              resultHandler: {
                                                (image, info) -> Void in
                                                print("Image \(String(describing: image))")
                                                //self.photo = image!
                                                /* The image is now available to us */
                                                //self.addImgToArray(self.photo)
                                                print("enum for image, This is number 2")

            })

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.