en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.04.2012

使用 AssetsLibrary 取得圖庫中檔案的相關資訊

從 iOS 5.0 SDK 起,就可以透過 AssetsLibrary.framework 來取得或是管理裝置圖庫中的資料,下面程式碼我們將結合 UIImagePickerController 的使用範例,來取得影像的位置,並且利用它來獲得影像更多的相關資訊。

在開始之前請先替您的專案加上 AssetsLibrary.framework,並且在對應的類別中引用此標頭檔。替專案加入 Framework 的方法請參考Xcode 4 新增 Framework 的方法一文。


關鍵方法函式
由於本範例是透過 UIImagePickerController 來取得圖片的位置,自然關鍵的方法函式就落在使用者在圖庫點選檔案之後所觸發的關鍵方法函式裡,下列的所有程式碼也都是在此方法函式中執行。
-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info {}


製作 Block 區塊
在使用 AssetsLibrary 取得檔案相關資訊時,會使用到兩個 Block,ALAssetsLibraryAssetForURLResultBlock 與 ALAssetsLibraryAccessFailureBlock ,它們分別代表著取得檔案的成功與失敗所觸發的方法函式。
ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset *myAsset) {
    ALAssetRepresentation *representation = [myAsset defaultRepresentation];
    NSLog(@"圖片名稱 : %@",[representation filename]);
    NSLog(@"圖片位置 : %@",[representation url]);
    NSLog(@"圖片比例 : %f",[representation scale]);

    switch ([representation orientation]) {
        case ALAssetOrientationUp:
            NSLog(@"圖片比例 : 正向");
            break;

        default:
            NSLog(@"圖片比例 : 非正向");
            break;
    }

    NSLog(@"圖片方向 : %d",[representation orientation]);
};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
    //失敗處理常式
};

在上述程式碼中,ALAssetRepresentation 型態內存放影像檔案的描述,像是檔案名稱、位置、方向等等,另外,你可以參考 iOS Developer Library 上的 ALAssetRepresentation Class Reference 獲得其他的檔案描述。

ps:Block 為 iOS 4.0 SDK 開始有的技術, 請參考 Blocks!你不得不學習的 iOS 4 coding 新技術!一文,或是前往 iOS Developer Library 獲得更多資訊。


使用 AssetsLibrary
在完成上述的 Block 區塊設置之後,在接下來的這個部分,我們就可以透過「關鍵方法函式」的 info 參數來取檔案在裝置內的實際位置,並且使用 AssetsLibrary 來取得檔案,其程式碼如下。
NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:imageURL resultBlock:resultBlock failureBlock:failureBlock];


透過 AssetsLibrary 取得檔案相關資訊的執行結果







沒有留言:

張貼留言