web-dev-qa-db-fra.com

Obtenez toutes les images d'une photoLibrary iPhone dans un tableau en utilisant le framework AssetsLibrary?

Je veux obtenir toutes les images de photoLibrary. Je préférerais une méthode ou un exemple que je peux utiliser directement.

19
user1396086

// Voir le fichier d'en-tête du contrôleur (.h).

#import <UIKit/UIKit.h>
#include <AssetsLibrary/AssetsLibrary.h> 

@interface getPhotoLibViewController : UIViewController
{
 ALAssetsLibrary *library;
 NSArray *imageArray;
 NSMutableArray *mutableArray;
}

-(void)allPhotosCollected:(NSArray*)imgArray;

 @end

// fichier d'implémentation 

déclarer la variable de comptage globale comme 

static int count=0;

@implementation getPhotoLibViewController

-(void)getAllPictures
{
 imageArray=[[NSArray alloc] init];
 mutableArray =[[NSMutableArray alloc]init];
 NSMutableArray* assetURLDictionaries = [[NSMutableArray alloc] init];

 library = [[ALAssetsLibrary alloc] init];

 void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
  if(result != nil) {
   if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
    [assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]];

    NSURL *url= (NSURL*) [[result defaultRepresentation]url]; 

    [library assetForURL:url
             resultBlock:^(ALAsset *asset) {
              [mutableArray addObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]]];

              if ([mutableArray count]==count)
              {
               imageArray=[[NSArray alloc] initWithArray:mutableArray];
               [self allPhotosCollected:imageArray];
              }
             }
            failureBlock:^(NSError *error){ NSLog(@"operation was not successfull!"); } ]; 

   } 
  }
 };

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

 void (^ assetGroupEnumerator) ( ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop) {
  if(group != nil) {
   [group enumerateAssetsUsingBlock:assetEnumerator];
   [assetGroups addObject:group];
   count=[group numberOfAssets];
  }
 };

 assetGroups = [[NSMutableArray alloc] init];

 [library enumerateGroupsWithTypes:ALAssetsGroupAll
                        usingBlock:assetGroupEnumerator
                      failureBlock:^(NSError *error) {NSLog(@"There is an error");}];
}

-(void)allPhotosCollected:(NSArray*)imgArray
{
 //write your code here after getting all the photos from library...
 NSLog(@"all pictures are %@",imgArray);
}

@end

Utilisez la méthode getAllPicture pour obtenir des photos de la photothèque.

OU Vous pouvez consulter ce blog http://mutiselectimagepicker.blogspot.in/2014/08/imageselect-to-allow-multiple-selection.html

29
Warewolf

Puisque ALAssetsLibrary est obsolète maintenant et que Photo Framework en est un nouveau. J'ai créé ma propre fonction dans Objective C pour obtenir toutes les photos de la pellicule et les stocker dans NSArray et les afficher dans ma Collectionview

 NSArray *imageArray;
 NSMutableArray *mutableArray;

-(void)getAllPhotosFromCamera
{
    imageArray=[[NSArray alloc] init];
    mutableArray =[[NSMutableArray alloc]init];

    PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
    requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
    requestOptions.synchronous = true;
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];

    NSLog(@"%d",(int)result.count);

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

    // assets contains PHAsset objects.

    __block UIImage *ima;
    for (PHAsset *asset in result) {
        // Do something with the asset

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

                            [images addObject:ima];
                        }];


    }

    imageArray = [images copy];  // You can direct use NSMutuable Array images
}
6
karan

-(void)getFromGallery:(BOOL )IsImages
{
    if(self.csCollectionsArray != nil)
        [self.csCollectionsArray removeAllObjects];
    __block NSMutableDictionary *date = [[NSMutableDictionary alloc] init];
    ALAssetsLibrary *csAssetsLibrary = [[ALAssetsLibrary alloc] init];
    NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupSavedPhotos;
    [csAssetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stop)
    {
        if([group numberOfAssets] > 0)
        {
            if(IsImages)
                [group setAssetsFilter:[ALAssetsFilter allPhotos]];
            else
                [group setAssetsFilter:[ALAssetsFilter allVideos]];
            [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
            {
                if(asset)
                { //1.fetching all assets from device library
                    //2.Add all fetched assests from library
                    [date setObject:asset forKey:[asset valueForProperty:ALAssetPropertyDate]];
                }
            }];
        }
        else
        { NSLog(@"---> load table -------->");
            if(date != nil && date.count > 0)
            { //3.Sort using date by ascending order and moved to dictionary to array
                NSArray *sortedKeys = [[date allKeys] sortedArrayUsingSelector: @selector(compare:)];
                for (NSString *key in sortedKeys)
                    [self.csCollectionsArray addObject: [date objectForKey:key]];
                //4.Load images into collection view after fetching all datas
                [self reloadCollectionView];
                if(self.csCollectionView != nil)
                    [self.csCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:([self.csCollectionsArray count] - 1) inSection:0] atScrollPosition:UICollectionViewScrollPositionBottom animated:YES];
            }
            date = nil;
        }
    }failureBlock:^(NSError *error)
    {
        if((csCollectionsArray == nil || [csCollectionsArray count] == 0))
        {
            ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; if(status != ALAuthorizationStatusAuthorized)
            {
                [self showAlertAndCloseUploaderView:@"You can just go to \"Settings\" app (General -> Reset -> Reset Location & Privacy) then come again and click ok when the alert dialog is showing for enable the permission to access the photo library"];
            }
        }
    }];
}

Vous pouvez utiliser la méthode ci-dessous pour extraire toutes les images ou vidéos de la bibliothèque d'actifs dans ios. Utilisez ce cadre assetslibrary (must) REMARQUE: - #import 

-(void)getFromGallery:(BOOL )IsImages
{
    if(self.csCollectionsArray != nil)
        [self.csCollectionsArray removeAllObjects];
    __block NSMutableDictionary *date = [[NSMutableDictionary alloc] init];
    ALAssetsLibrary *csAssetsLibrary = [[ALAssetsLibrary alloc] init];
    NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupSavedPhotos;
    [csAssetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stop)
    {
        if([group numberOfAssets] > 0)
        {
            if(IsImages)
                [group setAssetsFilter:[ALAssetsFilter allPhotos]];
            else
                [group setAssetsFilter:[ALAssetsFilter allVideos]];
            [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
            {
                if(asset)
                { //1.fetching all assets from device library
                    //2.Add all fetched assests from library
                    [date setObject:asset forKey:[asset valueForProperty:ALAssetPropertyDate]];
                }
            }];
        }
        else
        { NSLog(@"---> load table -------->");
            if(date != nil && date.count > 0)
            { //3.Sort using date by ascending order and moved to dictionary to array
                NSArray *sortedKeys = [[date allKeys] sortedArrayUsingSelector: @selector(compare:)];
                for (NSString *key in sortedKeys)
                    [self.csCollectionsArray addObject: [date objectForKey:key]];
                //4.Load images into collection view after fetching all datas
                [self reloadCollectionView];
                if(self.csCollectionView != nil)
                    [self.csCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:([self.csCollectionsArray count] - 1) inSection:0] atScrollPosition:UICollectionViewScrollPositionBottom animated:YES];
            }
            date = nil;
        }
    }failureBlock:^(NSError *error)
    {
        if((csCollectionsArray == nil || [csCollectionsArray count] == 0))
        {
            ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus]; if(status != ALAuthorizationStatusAuthorized)
            {
                [self showAlertAndCloseUploaderView:@"You can just go to \"Settings\" app (General -> Reset -> Reset Location & Privacy) then come again and click ok when the alert dialog is showing for enable the permission to access the photo library"];
            }
        }
    }];
}
0
Kanagaraj