简体   繁体   English

如何从照片的自定义相册,iOS SDK获取图像?

[英]How to get images from Custom album of Photos, iOS SDK?

I'm working on an iOS app in which I need gallery view like Instagram. 我正在开发一个iOS应用程序,我需要像Instagram这样的画廊视图。 I have added gallery View, camera View and video View, after taking image it saves to custom album of Photos. 我已经添加了图库视图,相机视图和视频视图,在拍摄图像后,它会保存到照片的自定义相册中。 Now I want to retrieve those images from custom album and show it to Collection view of Gallery. 现在我想从自定义相册中检索这些图像并将其显示到Gallery的Collection视图。 But I'm getting stuck in retrieving those images from custom album. 但是我在从自定义相册中检索这些图片时遇到困难。 Any help will be appreciated. 任何帮助将不胜感激。 检查图片以获取参考

Edit: I added the PHPhotoLibrary for creating custom photo album, before this I added AssetsLibrary framework. 编辑:我添加了用于创建自定义相册的PHPhotoLibrary,在此之前我添加了AssetsLibrary框架。

An Then I created a NSObject class (CustomAlbum) for creating and managing the custom photo album using PHPhotoLibrary. 然后我创建了一个NSObject类(CustomAlbum),用于使用PHPhotoLibrary创建和管理自定义相册。

// CustomAlbum.h // CustomAlbum.h

#import <Foundation/Foundation.h>
#import <Photos/Photos.h>


@interface CustomAlbum : NSObject

//Creating album with given name
+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError;

//Get the album by name
+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName;

//Add a image
+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError;

//get the image using identifier
+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError;


@end

// CustomAlbum.m // CustomAlbum.m

#import "CustomAlbum.h"

@implementation CustomAlbum

#pragma mark - PHPhoto

+(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError
{
    //Check weather the album already exist or not
    if (![self getMyAlbumWithName:title]) {
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            // Request editing the album.
            PHAssetCollectionChangeRequest *createAlbumRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];

            // Get a placeholder for the new asset and add it to the album editing request.
            PHObjectPlaceholder * placeHolder = [createAlbumRequest placeholderForCreatedAssetCollection];
            if (placeHolder) {
                onSuccess(placeHolder.localIdentifier);
            }

        } completionHandler:^(BOOL success, NSError *error) {
            NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
            if (error) {
                onError(error);
            }
        }];
    }
}

+(void)addNewAssetWithImage:(UIImage *)image toAlbum:(PHAssetCollection *)album onSuccess:(void(^)(NSString *ImageId))onSuccess onError: (void(^)(NSError * error)) onError
{
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // Request creating an asset from the image.
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

        // Request editing the album.
        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];

        // Get a placeholder for the new asset and add it to the album editing request.
        PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset];
        [albumChangeRequest addAssets:@[ placeHolder ]];

        NSLog(@"%@",placeHolder.localIdentifier);
        if (placeHolder) {
            onSuccess(placeHolder.localIdentifier);
        }

    } completionHandler:^(BOOL success, NSError *error) {
        NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
        if (error) {
            onError(error);
        }
    }];
}


+(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName
{
    #if 0
    NSString * identifier = [[NSUserDefaults standardUserDefaults]objectForKey:kAlbumIdentifier];
    if (!identifier) return nil;
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[identifier]
                                                                                           options:nil];
    #else
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                                               subtype:PHAssetCollectionSubtypeAlbumRegular
                                                                               options:nil];
    #endif
    NSLog(@"assetCollections.count = %lu", assetCollections.count);
    if (assetCollections.count == 0) return nil;

    __block PHAssetCollection * myAlbum;
    [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *album, NSUInteger idx, BOOL *stop) {
        NSLog(@"album:%@", album);
        NSLog(@"album.localizedTitle:%@", album.localizedTitle);
        if ([album.localizedTitle isEqualToString:AlbumName]) {
            myAlbum = album;
            *stop = YES;
        }
    }];

    if (!myAlbum) return nil;
    return myAlbum;
}

+(NSArray *)getAssets:(PHFetchResult *)fetch
{
    __block NSMutableArray * assetArray = NSMutableArray.new;
    [fetch enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
        NSLog(@"asset:%@", asset);
        [assetArray addObject:asset];
    }];
    return assetArray;
}



+ (void)getImageWithIdentifier:(NSString*)imageId onSuccess:(void(^)(UIImage *image))onSuccess onError: (void(^)(NSError * error)) onError
{
    NSError *error = [[NSError alloc] init];
    PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[imageId] options:nil];
    if (assets.count == 0) onError(error);

    NSArray * assetArray = [self getAssets:assets];
    PHImageManager *manager = [PHImageManager defaultManager];
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [manager requestImageForAsset:assetArray.firstObject targetSize:screenRect.size contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        onSuccess(result);
    }];
}

@end

And then use this method on take Image Button click to create custom album and save images in that custom album. 然后使用此方法获取图像按钮单击以创建自定义相册并将图像保存在该自定义相册中。

 // Take Image Button Method

- (void)snapButtonPressed:(UIButton *)button
{
    [self.camera capture:^(LLSimpleCamera *camera, UIImage *image,
                           NSDictionary *metadata, NSError *error)
     {
         if(!error)
         {
             NSString * info = [NSString stringWithFormat:@"Size: %@  -  Orientation: %ld", NSStringFromCGSize(image.size), (long)image.imageOrientation];

             [CustomAlbum addNewAssetWithImage:image toAlbum:[CustomAlbum getMyAlbumWithName:CSAlbum] onSuccess:^(NSString *ImageId) {
                 NSLog(@"%@",ImageId);
                 recentImg = ImageId;
             } onError:^(NSError *error) {
                 NSLog(@"probelm in saving image");
             }];
         }
         else
         {
             NSLog(@"An error has occured: %@", error);
         }
     }
          exactSeenImage:YES];
}

Here is the code that works. 这是有效的代码。

__block PHAssetCollection *collection;

// Find the album
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", @"YOUR_CUSTOM_ALBUM_NAME"];
collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                  subtype:PHAssetCollectionSubtypeAny
                                                  options:fetchOptions].firstObject;

PHFetchResult *collectionResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

[collectionResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {


    //add assets to an array for later use in the uicollectionviewcell

}];

Just try once this code.. You can get all images in one array using this code:- 只需尝试一次此代码..您可以使用以下代码获取一个数组中的所有图像: -

-(void)getAllPictures
{

    __block PHAssetCollection *collection;

    // Find the album
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", @"YOUR_CUSTOM_ALBUM_NAME"];
    collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                          subtype:PHAssetCollectionSubtypeAny
                                                          options:fetchOptions].firstObject;

    PHFetchResult *collectionResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

    NSMutableArray *assets = [[NSMutableArray alloc] init];

    [collectionResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
        [assets addObject:asset];

    }];

    PHImageRequestOptions * requestOptions = [[PHImageRequestOptions alloc] init];
    //requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    //requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

    // this one is key
    //requestOptions.synchronous = true;


    PHImageManager *manager = [PHImageManager defaultManager];
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:[assets count]];

    // assets contains PHAsset objects.
    __block UIImage *ima;

    for (PHAsset *asset in assets) {
        // Do something with the asset

        [manager requestImageForAsset:asset
                           targetSize:PHImageManagerMaximumSize//CGSizeMake(300, 300)
                          contentMode:PHImageContentModeDefault
                              options:requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) {
                            ima = image;

                            [images addObject:ima];
                        }];
    }

    NSLog(@"images %@", images); //You will get all images into this images array.

}

For more details, Please refer Example app using Photos framework . 有关更多详细信息,请参阅使用Photos框架的示例应用

Hope, this is what you're looking for. 希望,这是你正在寻找的。 Any concern get back to me. 任何关注都会回复给我。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM