2012年12月14日

ALAssetsLibraryを使う(4)

ALAssetについて

ALAssetsLibraryを使う(3)のように、ALAssetからサムネール画像は下記のように取得できますが、他にALAssetから何が取得できるかをまとめます。

//assetはALAssetのインスタンス
UIImage *image = [UIImage imageWithCGImage:[asset thumbnail]];

● ALAssetRepresentationでフルスクリーン表示用の画像を取得

ALAssetの画像やムービーなどの生データにアクセスするには、「ALAssetRepresentation」を使用します。フルスクリーン表示用の画像を取得するには「fullScreenImage」、元画像と同じ解像度の画像を取得する場合は「fullResolutionImage」を使用します。

//ALAssetRepresentationクラスのインスタンスを作成
//assetはALAssetのインスタンス
ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation];

//ALAssetRepresentationを使用して、フルスクリーン用の画像をUIImageに変換
//元画像と同じ解像度の画像を取得する場合は「fullResolutionImage」
UIImage *fullscreenImage = [UIImage imageWithCGImage:[assetRepresentation fullScreenImage]
    scale:2.0f
    orientation:UIImageOrientationUp];

//UIImageViewを使用してスクリーンに表示                 
UIImageView *imageView = [[UIImageView alloc] initWithImage:fullscreenImage];
[self.view addSubview:imageView];

● メタデータにアクセスする

ALAssetは、メタデータにアクセスすることもできます。メタデータのファイルの作成日などを取得するには、「valueForProperty:」を使用します。

//アセットの作成日はALAssetPropertyDate
//assetはALAssetのインスタンス
NSString *dateStr = [asset valueForProperty:ALAssetPropertyDate];

作成日の他、位置情報やアセットの向き、ムービーの再生時間も取得できます。
・ALAssetPropertyDate (作成日)
・ALAssetPropertyLocation (位置情報)
・ALAssetPropertyOrientation (アセットの向き)
・ALAssetPropertyDuration (ムービーの再生時間)
また、iOS4.1から、Exif情報の取得や保存もできるようになりました。

● ALAssetsGroupの代表画像

ちなみに、アルバムには代表画像というものが用意されていて、下記のような形で取得できます。

//groupはALAssetsGroupのインスタンス
UIImage *image = [UIImage imageWithCGImage:[group posterImage]];

ALAssetsLibraryを使ってハマった点

(1) ALAssetsGruopやALAssetのインスタンスは、元のALAssetsLibraryインスタンスが解放されてしまうと一緒に解放されてしまうらしく、意図しない場所でNullになって困った。
→クラス間でやり取りするときはURLを保持してやり取りをする必要があるようです。

(2) ALAssetがなぜか取得できなくて困った。
→ALAssetGroupやALAssetの取得などは時間がかかるため、Blocks内できちっと非同期処理を行う必要があるようです。

(3) なぜか、ALAssetGroupに「addAsset:」できる時とできない時がある。
→ALAssetGroupのeditableがTRUEの時のみ「addAsset:」は成功するので、きちっとTRUEかどうか調べる。

(4) ALAssetのURLをファイルに保存して管理しようとしたが...
→ALAssetGroupやALAssetのURLは、ライブラリ内の情報変化によって変化するので、永続的に保存してはいけないようです。

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

ALAssetsLibraryを使う(3)

次の記事へ

UIViewのタップを検知