iOS 5 取景器和即時濾鏡的製作

來源:互聯網
上載者:User

1.使用UIImagePickerController捕捉媒體製作取景器

      UIImagePickerController是一個UINavigationController的子類,他是UIKit的一部分,因此不需要添加額外的架構,使用很簡單,但卻功能強大。我們可以使用它選擇來源媒體的類型,UIImagePicker有三種媒體來源可供選擇:UIImagePickerControllerSourceTypePhotoLibrary(系統的照片庫選擇照片),UIImagePickerControllerSourceTypeSavedPhotosAlbum(只能在儲存的相簿中選擇照片),UIImagePickerControllerSourceTypeTypeCamera(使用網路攝影機來擷取圖片或視頻)。因此我們既可以從本地擷取圖片,也可以調用網路攝影機來捕捉新媒體,當我們選擇了捕捉的媒體時它就會調用它代理的didFinishPickingMediaWithInfo:方法。UIImagePickerControllerSourceType還允許開發人員提供一個視圖,疊加在預覽視圖上面,因此我們可以通過自訂一個視圖來製作一個漂亮的取景器。

         取景器製作步驟:1建立一個UIImagePickerController,使用網路攝影機作為來源;2 必須在顯示映像選取器之前,加上一個讓使用者拍照的方法;3簡曆一個Uiview作為疊加層,你可以像對待任何其他UIView一樣來處理這個疊加層,你可以加上動畫,加上任意的子視圖等等。下面的代碼示範了一個簡單的取景器。

-(void)showCustomCamera
{
    //建立UIImagePickerController
    picker=[[UIImagePickerController alloc]init];
    picker.sourceType=UIImagePickerControllerSourceTypeCamera;//選取網路攝影機作為來源
    [picker setDelegate:self];
   
    picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;//強制選取自拍;
    picker.showsCameraControls=NO;//禁用網路攝影機空件
   
    //建立疊加層
    UIView *overLayView=[[UIView alloc]initWithFrame:self.view.bounds];
    //取景器的背景圖片,該圖片中間挖掉了一塊變成透明,用來顯示網路攝影機擷取的圖片;
    UIImage *overLayImag=[UIImage imageNamed:@"overLay.png"];
    UIImageView *bgImageView=[[UIImageView alloc]initWithImage:overLayImag];
    [overLayView addSubview:bgImageView];
   
    //在疊加視圖上自訂一個拍照按鈕
    UIButton *takePhotoBtn=[UIButton buttonWithType:UIButtonTypeCustom];
    [takePhotoBtn setFrame:CGRectMake(74, 370, 178, 37)];
    [takePhotoBtn addTarget:self action:@selector(takePhoto:) forControlEvents:UIControlEventTouchUpInside];
    [overLayView addSubview:takePhotoBtn];
   
    //將視圖設定為網路攝影機的疊加層
    picker.cameraOverlayView=overLayView;
   
    //顯示選取器
    [self presentModalViewController:picker animated:YES];
}

-(void)takePhoto:(id)sender
{
    [picker takePicture];//他將會自動調用代理方法完成照片的拍攝;
}

2.使用AV Foundation架構來實現即時濾鏡

         UIImagePickerController處理的並不是原始網路攝影機資料,他是在未經處理資料被處理成映像後才開始訪問。而AV Foundation能在未經處理資料變成映像之前就直接存取它,這就使得我們能夠執行一些額外的暗箱操作,來實現即時濾鏡的製作。

         AVCaptureSession用來控制輸入裝置(AVCaptureDeviceInput)視頻映像到流入輸出緩衝區(AVCaptureOutput)的過程。一旦AVCaptureSession啟動以後,就會收集來自輸入裝置的資訊,並在適當的時候將這些資訊輸出到資料緩衝區中。

         AVCaptureVideoPreviewLayer預設情況下會顯示來自輸入裝置的未經處理資料,如果要實現即時濾鏡或在這個圖層上繪製額外的物體,那麼就要衝視頻輸出緩衝區擷取資料幀資料,並對其進行處理,處理完畢後可將像素資料輸出到另一個圖層或者OpenGL上下文中。

         AVCaptureConnection是一個類,用來在AVCaptureInput和AVCaptureOutput之間建立串連。AVCaptureSession必須從AVCaptureConnection中擷取實際資料。

         相機即時效果製作過程:建立一個新的AVCaptureSession;設定對映像品質的預置值;通過AVCaptureDevice來建立必要的輸入捕捉裝置如網路攝影機;通過AVCaptureStillImageOutput或者AVCaptureVideoDataOutput來添加一個輸出緩衝區;建立AVCaptureVideoPreviewLayer(預覽圖層),並將他添加到視圖控制器相關聯的視圖中,成為子視圖;啟動AVCaptureSession;擷取一個AVCaptureConnection的引用,該連結位於AVCaptureInput和AVCaptureVideoDataOutput之間;從AVCaptureVideoDataOutput中抓取單獨幀的資料,然後將其顯示在自己定製的預覽圖層中。

 

 總結:

         UIImagePickerController可以用於進行簡單的媒體捕捉,通過設定屬性sourceType和captureMode可以對UIImagePickerController進行簡單的配置,讓他以不同的解析度捕捉靜止映像或者視頻。

         AVFoundation可以用來建立我們自己定製的捕捉解決方案,我們可以在幀資料剛剛從裝置上捕捉到時就訪問這些資料,而不用等到映像資料被最終確定之後,這就給我們提供相機即時效果以及其他的濾鏡操作。


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.