kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

写真データの列挙

ALAssetsLibraryを使えばOSに保存された写真を列挙できる。

  • AssetsLibrary.frameworkをリンク
  • AssetsLibrary/AssetsLibrary.hを#import
  • ALAssetsGroupのposterImageやALAssetのthumbnailから縮小画像を取得できるが解像度がかなり低い
  • 写真の列挙には時間がかかるので、別スレッドで処理する
  • 別スレッドで生成したUIViewはperformSelectorOnMainThreadにて追加する

50枚程度でも待ちきれないほど時間がかかるので、通常は別スレッドで非同期処理にする。その際、画像ごとにUIViewを生成するのであれば、addSubViewをperformSelectorOnMainThreadで呼び出してやれば、1枚ずつ画像を表示できる。

この中で、ALAssetからはthumbnail(75x75)、ALAssetsGroupからはposterImage(90x90)経由で小さめの画像がすぐに取得できるが、解像度が小さすぎるので用途は限られる。アプリによってはサムネイル画像も自分で作ったほうがよい。

//#import <AssetsLibrary/AssetsLibrary.h>

ALAssetsLibrary *assetsLib = [[ALAssetsLibraryalloc] init];
[assetsLib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                         usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if (result) {
            ALAssetRepresentation *rep = [result defaultRepresentation];
            CGImageRef imageRef = [rep fullResolutionImage];

            //[scrollView performSelectorOnMainThread:@selector(addSubview:)
            //                             withObject:imageView waitUntilDone:NO];
        }
    } ];
} failureBlock:nil];
[assetsLib release];