2012年12月12日

ALAssetsLibraryを使う(3)

アルバムから写真を取得してサムネール一覧を作る

ALAssetsLibraryを使う(1)ALAssetsLibraryを使う(2)でアルバムを新規作成し、写真を追加することができたので、今度は、アルバムから写真を取得してサムネール一覧を作ります。



● ALAssetsLibraryからアルバムを取得、アルバムからALAssetを取得

ALAssetsLibraryからアルバムを取得するのは、「enumerateGroupsWithTypes: usingBlock: failureBlock:」を使います。アルバムからALAssetを取得するのは、「enumerateAssetsUsingBlock:」です。

[_library enumerateGroupsWithTypes:ALAssetsGroupAlbum
    usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

        //アルバムがなかった場合はgroupがNUL
        //ALAssetsLibraryのすべてのアルバムが列挙される
        if (group) {

            //アルバム名が「_AlbumName」と同一だった時の処理
            if ([_AlbumName compare:[group valueForProperty:ALAssetsGroupPropertyName]] == NSOrderedSame) {

               //ここでALAssetsLibraryからアルバム(group)を取得できる

               //assetsEnumerationBlock
               ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {

                    if (result) {
                        //asset をNSMutableArraryに格納
                        [_AlAssetsArr addObject:result];
                                                
                    }else{
                        //NSMutableArraryに格納後の処理(テスト的に_AlAssetsArrを確認)
                        NSLog(@"%@",_AlAssetsArr);
                    }
                };

               //アルバム(group)からALAssetの取得        
               [group enumerateAssetsUsingBlock:assetsEnumerationBlock];
            }
        } 
} failureBlock:nil];

● ALAssetについて

今まで「ALAsset = 画像、動画」のように扱ってきましたが、正確に言うとALAssetは画像や動画、Exif情報などのメタデータを梱包した抽象化されたクラスのインスタンスになります。ALAssetは、画像や動画を直接扱うより、自動的に各デバイスの差違を吸収したサムネールを生成してくれたりといろいろな便利です。

● ALAssetからサムネールを取得して、サムネール一覧を作成する

例えば、サムネールを取得して、UIImageに変換する場合は下記のような感じです。

UIImage *image = [UIImage imageWithCGImage:[asset thumbnail]];

取得したUIImageをUIImageViewに梱包し、タイル上に並べればサムネール一覧を作成できます。

ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {

    if (result) {
        [_AlAssetsArr addObject:result];                              
    }else{

        for (int i=0; i<[_AlAssetsArr count]; i++) {
            int x,y;

            //タイル上に並べるためのx、yの計算
            x = ((i % 3) * 100) + 10;
            y = ((i / 3) * 100) + 10;
            
            //ALAssetからサムネール画像を取得してUIImageに変換                                  
            UIImage *image = [UIImage imageWithCGImage:[[_AlAssetsArr objectAtIndex:i] thumbnail]];

            //表示させるためにUIImageViewを作成
            UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

            //UIImageViewのサイズと位置を設定
            imageView.frame = CGRectMake(x,y,90,90);

            //ViewにaddSubView
            [self.view addSubview:imageView];
        }
    }
};

写真を取得してサムネール一覧を作るソースコード

● ThumViewController.h

ソースコードが複雑になってしまうので、必要な部分のみ記述したものをまとめます。
※アルバムはすでに作成されていて、中に画像が複数枚ある想定になります。

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

@interface AssetViewController : UIViewController
    <UINavigationControllerDelegate, UIImagePickerControllerDelegate>{
{
    ALAssetsLibrary *_library;
    NSString *_AlbumName;
    NSMutableArray *_AlAssetsArr;
}

@end

● ThumViewController.m

ALAssetを格納するNSMutableArrayを作成しています。

#import "ThumViewController.h"

@implementation ThumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _library = [[ALAssetsLibrary alloc] init];
    _AlbumName = @"myPhotoAlbum";
    _AlAssetsArr = [NSMutableArray array];
    
    //AlAssetsLibraryからALAssetGroupを検索
    [_library enumerateGroupsWithTypes:ALAssetsGroupAlbum
        usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

            //ALAssetsLibraryのすべてのアルバムが列挙される
            if (group) {

                //アルバム名が「_AlbumName」と同一だった時の処理
                if ([_AlbumName compare:[group valueForProperty:ALAssetsGroupPropertyName]] == NSOrderedSame) {

                   //assetsEnumerationBlock
                   ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {

                        if (result) {
                            //asset をNSMutableArraryに格納
                            [_AlAssetsArr addObject:result];

                        }else{
                            //NSMutableArraryに格納後の処理
                            for (int i=0; i<[_AlAssetsArr count]; i++) {
                                int x,y;

                                //タイル上に並べるためのx、yの計算
                                x = ((i % 3) * 100) + 10;
                                y = ((i / 3) * 100) + 10;
            
                                //ALAssetからサムネール画像を取得してUIImageに変換                                  
                                UIImage *image = [UIImage imageWithCGImage:[[_AlAssetsArr objectAtIndex:i] thumbnail]];

                                //表示させるためにUIImageViewを作成
                                UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

                                //UIImageViewのサイズと位置を設定
                                imageView.frame = CGRectMake(x,y,90,90);

                                //ViewにaddSubView
                                [self.view addSubview:imageView];
                            }
                        }

                    };

                   //アルバム(group)からALAssetの取得        
                   [group enumerateAssetsUsingBlock:assetsEnumerationBlock];
                }            
            }
                        
        } failureBlock:nil];
}

@end
  • このエントリーをはてなブックマークに追加
前の記事へ

ALAssetsLibraryを使う(2)

次の記事へ

ALAssetsLibraryを使う(4)