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

使用 UIImagePickerController 截取 Camera 畫面的方法

 


UIImagePickerController 大部份都是被使用來實作照相機(Photo)的功能,有別與使用 AVFoundation Framework 來實作攝影機(Video),如果你想要瞭解 AVFoundation 的操作方式,可以參考Camera / 攝影機畫面的擷取方式-前篇一文,與Camera / 攝影機畫面的擷取方式-後篇ㄧ文。下列我們就來示範了如何使用 UIImagePickerController 來實作照相機的基本功能,其程式碼如下。

在開始實做這些功能之前,要先替我們的 ViewController 加上代理方法,設定的方式是來到 ViewController.h 程式中的 @Interface 區段並增加 UINavigationControllerDelegate 與 UIImagePickerControllerDelegate 兩個代理,此目的是可以讓我們在 ViewController 下直接呼叫 UIImagePickerController 所產生的畫面。

@interface MLViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
接下來我們再按鈕事件中實作呼叫 UIImagePickerController 相機的介面設定,程式碼如下。

- (IBAction)onCameraButtonPress:(id)sender {

    //建立一個ImagePickerController
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

    //設定影像來源
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;

    //顯示Picker
    [self presentModalViewController:imagePicker animated:YES];
}

最後就是實作當使用者按下「使用」這張影像時的動作,我們只要將實作的內容寫在一個 UIImagePickerController 的內建函式即可。

//使用代理之後才會出現的內建函式
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    //取得影像
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    //將影像縮小顯示於畫面中央(原圖是480*960)
    UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
    [imageView setFrame:CGRectMake(0.0, 0.0, 160.0, 240.0)];
    [imageView setCenter:self.view.center];

    [self.view addSubview:imageView];

    //移除Picker
    [picker dismissModalViewControllerAnimated:YES];
}

另外如果你有相機介面語系的問題(沒意外的話,操作介面應該是英文),請到專案下的 InfoPlist.strings 檔案,在它的 Localization 屬性下新增一個你想要的語系即可(Zh-Hans 代表簡體中文,Zh-Hant 代表繁體中文),若是在你的專案中找不到 InfoPlist.strings 檔案,可以手動為專案新增一個 Strings File 即可。


ps:如果您想要將影像存至圖片庫中,可以參考將影像存至相簿 Album 的方法ㄧ文。






8 則留言:

  1. 這篇教學我接收了,謝啦:)

    回覆刪除
    回覆
    1. 您好 cg2010studio:

      不用客氣,謝謝你喜歡我們的文章!

      刪除
  2. 牛奶您好,
    請問重新拍攝跟使用這兩個鍵可以偵測他的動作嗎??

    回覆刪除
    回覆
    1. 鈞 您好:

      你點擊UIImagePickerControllerDelegate時可以查閱他有哪些函式可以使用:
      @protocol UIImagePickerControllerDelegate
      @optional
      // The picker does not dismiss itself; the client dismisses it in these callbacks.
      // The delegate will receive one or the other, but not both, depending whether the user
      // confirms or cancels.
      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
      - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

      @end

      我想你要的函式都在這裡,祝你順利!

      刪除
    2. 謝謝!!- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker; 是取消鍵
      (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);這被禁用了
      - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
      這use後才會進去
      重新拍攝我找不到可控制的@@

      刪除
    3. 我現在用的方法是把

      showsCameraControls = NO;

      然後自己做cameraOverlayView

      刪除
    4. 您好:
      重新拍攝我想可能就是回到拍攝畫面再繼續其他的動作,如果要捕捉這個關鍵時刻,可能要改寫UIImagePickerController裡面的方法才行,或是直接增加一個自定的按鈕:
      http://stackoverflow.com/questions/16852601/custom-use-cancel-retake-and-reverse-camera-button-event-using-uiimagep

      http://stackoverflow.com/questions/5429509/how-to-implement-custom-use-and-retake-button-in-uiimagepicker

      然後是你的解決方式
      http://stackoverflow.com/questions/1853822/is-there-a-delegate-method-that-gets-called-when-the-user-pressed-retake-on-th

      目前就只有這幾種方式來解決這個問題,不過我不去定這是否會影響你app的上架審核!

      刪除
    5. 謝謝你!!!

      刪除