iOS 5 取景器和实时滤镜的制作
1.使用UIImagePickerController捕捉媒體制作取景器
????? UIImagePickerController是一個UINavigationController的子類,他是UIKit的一部分,因此不需要添加額外的框架,使用很簡單,但卻功能強(qiáng)大。我們可以使用它選擇來源媒體的類型,UIImagePicker有三種媒體來源可供選擇:UIImagePickerControllerSourceTypePhotoLibrary(系統(tǒng)的照片庫選擇照片),UIImagePickerControllerSourceTypeSavedPhotosAlbum(只能在保存的相冊中選擇照片),UIImagePickerControllerSourceTypeTypeCamera(使用攝像頭來獲取圖片或視頻)。因此我們既可以從本地獲取圖片,也可以調(diào)用攝像頭來捕捉新媒體,當(dāng)我們選擇了捕捉的媒體時它就會調(diào)用它代理的didFinishPickingMediaWithInfo:方法。UIImagePickerControllerSourceType還允許開發(fā)者提供一個視圖,疊加在預(yù)覽視圖上面,因此我們可以通過自定義一個視圖來制作一個漂亮的取景器。
???????? 取景器制作步驟:1創(chuàng)建一個UIImagePickerController,使用攝像頭作為來源;2 必須在顯示圖像選取器之前,加上一個讓用戶拍照的方法;3簡歷一個Uiview作為疊加層,你可以像對待任何其他UIView一樣來處理這個疊加層,你可以加上動畫,加上任意的子視圖等等。下面的代碼演示了一個簡單的取景器。
-(void)showCustomCamera {//創(chuàng)建UIImagePickerControllerpicker=[[UIImagePickerController alloc]init];picker.sourceType=UIImagePickerControllerSourceTypeCamera;//選取攝像頭作為來源[picker setDelegate:self];picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;//強(qiáng)制選取前置攝像頭;picker.showsCameraControls=NO;//禁用攝像頭空件//創(chuàng)建疊加層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];//將視圖設(shè)置為攝像頭的疊加層picker.cameraOverlayView=overLayView;//顯示選取器[self presentModalViewController:picker animated:YES]; }-(void)takePhoto:(id)sender {[picker takePicture];//他將會自動調(diào)用代理方法完成照片的拍攝; }
2.使用AV Foundation框架來實現(xiàn)實時濾鏡
???????? UIImagePickerController處理的并不是原始攝像頭數(shù)據(jù),他是在原始數(shù)據(jù)被處理成圖像后才開始訪問。而AV Foundation能在原始數(shù)據(jù)變成圖像之前就直接訪問它,這就使得我們能夠執(zhí)行一些額外的暗箱操作,來實現(xiàn)實時濾鏡的制作。
???????? AVCaptureSession用來控制輸入設(shè)備(AVCaptureDeviceInput)視頻圖像到流入輸出緩沖區(qū)(AVCaptureOutput)的過程。一旦AVCaptureSession啟動以后,就會收集來自輸入設(shè)備的信息,并在適當(dāng)?shù)臅r候?qū)⑦@些信息輸出到數(shù)據(jù)緩沖區(qū)中。
???????? AVCaptureVideoPreviewLayer默認(rèn)情況下會顯示來自輸入設(shè)備的原始數(shù)據(jù),如果要實現(xiàn)實時濾鏡或在這個圖層上繪制額外的物體,那么就要沖視頻輸出緩沖區(qū)獲取數(shù)據(jù)幀數(shù)據(jù),并對其進(jìn)行處理,處理完畢后可將像素數(shù)據(jù)輸出到另一個圖層或者OpenGL上下文中。
???????? AVCaptureConnection是一個類,用來在AVCaptureInput和AVCaptureOutput之間建立連接。AVCaptureSession必須從AVCaptureConnection中獲取實際數(shù)據(jù)。
???????? 相機(jī)實時效果制作過程:創(chuàng)建一個新的AVCaptureSession;設(shè)置對圖像質(zhì)量的預(yù)置值;通過AVCaptureDevice來創(chuàng)建必要的輸入捕捉設(shè)備如攝像頭;通過AVCaptureStillImageOutput或者AVCaptureVideoDataOutput來添加一個輸出緩沖區(qū);建立AVCaptureVideoPreviewLayer(預(yù)覽圖層),并將他添加到視圖控制器相關(guān)聯(lián)的視圖中,成為子視圖;啟動AVCaptureSession;獲取一個AVCaptureConnection的引用,該鏈接位于AVCaptureInput和AVCaptureVideoDataOutput之間;從AVCaptureVideoDataOutput中抓取單獨(dú)幀的數(shù)據(jù),然后將其顯示在自己定制的預(yù)覽圖層中。
?
?總結(jié):
???????? UIImagePickerController可以用于進(jìn)行簡單的媒體捕捉,通過設(shè)置屬性sourceType和captureMode可以對UIImagePickerController進(jìn)行簡單的配置,讓他以不同的分辨率捕捉靜止圖像或者視頻。
???????? AVFoundation可以用來創(chuàng)建我們自己定制的捕捉解決方案,我們可以在幀數(shù)據(jù)剛剛從設(shè)備上捕捉到時就訪問這些數(shù)據(jù),而不用等到圖像數(shù)據(jù)被最終確定之后,這就給我們提供相機(jī)實時效果以及其他的濾鏡操作。
總結(jié)
以上是生活随笔為你收集整理的iOS 5 取景器和实时滤镜的制作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清河机械:用宜搭建设工厂数字化系统,节省
- 下一篇: 好饭不怕晚,Google基于人工智能AI