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.26.2011

使用 UIImagePickerController 從圖庫中取得影片 / 相片的方法


使用 UIImagePickerController 可以呼叫一個 iOS 內建的介面,先前的文章已經介紹過使用  UIImagePickerController 來截取相機拍攝的圖片或是影片,也介紹過如何將這些檔案存入裝置內建的圖庫中,現在我們則是要從裝置內建的圖庫中使用 UIImagePickerController 把這些檔案取出來。(已使用 ARC 機制)

以下是在實作此範例時,您可能會需要參考的文章連結。

這裡介紹的方法是一種通用的方式,意思就是你可以從圖庫中取得相片或者是影片,在開始之前同樣為您的 Class 先新增 UIImagePickerControllerDelegate  與 UINavigationControllerDelegate 的代理方法。

接下來我們是在一個按鈕事件中實作以下程式碼,當使用者在按下按鈕時,就會呼叫一個 iOS 內建的介面供使用者選取相片或是影片。

//按下按鈕時所觸發的函式
- (IBAction)getFromLibrary:(id)sender {

    //宣告一個UIImagePickerController並設定代理
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;

    //設定MediaType類型(不做此設定會自動忽略圖庫中的所有影片)
    NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:imagePicker.sourceType];
    imagePicker.mediaTypes = mediaTypes;

    //設定開啓圖庫的類型(預設圖庫/全部/新拍攝)
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    //以動畫方式顯示圖庫
    [self presentModalViewController:imagePicker animated:YES];
}

使用 UIImagePickerController 呼叫內建圖庫的方式都是大同小異,這裡比較特別的是,如果你希望在檢視圖庫時,能同時出現影片與相片兩種類型的檔案,那麼你就必須對 MediaTypes 做設定,否則你將只會在圖庫中看到那些靜態的相片,同樣的道理你也無法使用 UIImagePickerController 來取得影影機所拍攝的影片。

另一個值得注意的地方就是在開啓圖庫的類型這裡,可以參考在 UIImagePickerController.h 中對 UIImagePickerControllerSourceType 做的定義,如下。

enum {
    UIImagePickerControllerSourceTypePhotoLibrary,     //圖庫中的所有資料夾
    UIImagePickerControllerSourceTypeCamera,           //使用相機拍攝新的照片或影片
    UIImagePickerControllerSourceTypeSavedPhotosAlbum  //圖庫中的預設資料夾(相機膠卷)
};
typedef NSUInteger UIImagePickerControllerSourceType;

最後,是當使用者選取他們所要的相片或是影片時,所觸發的 UIImagePickerControllerDelegate 內建函式。

//UIImagePickerController內建函式
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    //取得使用的檔案格式
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    if ([mediaType isEqualToString:@"public.image"]) {

        //取得圖片
        image = [info objectForKey:UIImagePickerControllerOriginalImage];
    }

    if ([mediaType isEqualToString:@"public.movie"]) {

        //取得影片位置
        videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
    }


    //已動畫方式返回先前畫面
    [picker dismissModalViewControllerAnimated:YES];
}

在上述程式碼中,可以透過判斷 mediaType 來得知取的檔案是圖片還是影片而分別做處理,在圖片的部份直接使用一個 UIImage 變數來取得圖片,在影片的部份則是使用 NSURL 變數來記錄影片的位置。

ps:特別注意,請不要在 UIImagePickerController 內建函式中撰寫任何撥放影片的程式碼(包含呼叫播放影片的函式),影片會無法順利播放並呈現黑色畫面,如果想要播放選取的影片,可以利用所取的的影片位置,在其它函式中實作。






沒有留言:

張貼留言