web-dev-qa-db-ja.com

AssetsLibraryフレームワークを使用して、配列内のiPhone photoLibraryからすべての画像を取得しますか?

PhotoLibraryからすべての画像を取得したい。私は直接使用できる方法または例を好みます。

19
user1396086

// View Controller header(.h)file ..

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

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

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

 @end

//実装ファイル

グローバルカウント変数を次のように宣言します

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

写真ライブラリから写真を取得するには、getAllPictureメソッドを使用します。

または、このブログをご覧ください http://mutiselectimagepicker.blogspot.in/2014/08/imageselect-to-allow-multiple-selection.html

29
Warewolf

ALAssetsLibraryは現在非推奨であり、Photo Frameworkは新しいものです。 Objective Cで独自の関数を作成し、カメラロールからすべての写真を取得してNSArrayに保存し、コレクションビューに表示しました

 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"];
            }
        }
    }];
}

以下のメソッドを使用して、iOSのアセットライブラリからすべての画像または動画をフェッチできます。このアセットライブラリフレームワークを使用する(必須)注:-#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