最近在維護一個用到攝像頭的iOS app榜掌。由于什么都是從頭開始學的,趁著記憶還新鮮趕快記錄下學習內(nèi)容。這個應用中需要對拍攝下來的不同曝光度的照片進行合成星岗。為了更好的理解iOS中是如何拍照片的胚宦,以及更好的做圖像處理首有,對拍照片的類做了一點研究。本篇文章僅限于用攝像頭拍攝靜態(tài)圖片枢劝,不涉及視頻井联,音樂,麥克風您旁。
iOS有自己專屬個攝像頭接口烙常。但是由于app和iOS系統(tǒng)的互交是由iOS完成的,不熟悉的人很難在一個半成品的app中找出圖像數(shù)據(jù)究竟從哪里,怎么呈現(xiàn)到View上的蚕脏。因此在這里寫出我的理解侦副。
攝像頭用那個類?
iOS調(diào)用攝像頭有兩類方法驼鞭,一是用UIImagePickerController秦驯,二是AVFoundation。
前者適用于創(chuàng)建簡單拍攝的攝像頭挣棕。你按一個按鈕译隘,拍一個照片,存到相冊里就完了洛心」淘牛可以設置相片、視頻質(zhì)量词身,分辨率玻驻,預設的攝像頭面板,開不開閃光燈 etc. ?簡單實用偿枕,但是沒有其他可操作的余地璧瞬,就像自動擋的汽車??差不多。?
后者相對復雜渐夸,需要稍微花一點時間去理解和實踐他的運作原理嗤锉。但是他提供了一些底層內(nèi)容供開發(fā)者操作。有點像手動擋的汽車??墓塌。
總結一句話瘟忱,如果你的app僅需要拍張照片就完事,用UIImagePickerController就好苫幢。如果要對照片進行二次加工访诱,用AVFoundation。
UIImagePickerController怎么用韩肝?
要用UIImagePickerController來拍照或者錄制視頻通炒ゲ耍可以分為如下步驟:
1,創(chuàng)建UIImagePickerController對象哀峻。?
2涡相,指定拾取源,平時選擇照片時使用的拾取源是照片庫或者相簿剩蟀,此刻需要指定為攝像頭類型催蝗。
3,指定攝像頭育特,前置攝像頭或者后置攝像頭丙号。?
4,設置媒體類型mediaType,注意如果是錄像必須設置犬缨,如果是拍照此步驟可以省略喳魏,因為mediaType默認包含kUTTypeImage(注意媒體類型定義在MobileCoreServices.framework中)?
5,指定捕獲模式遍尺,拍照或者錄制視頻截酷。(視頻錄制時必須先設置媒體類型再設置捕獲模式?
6涮拗,展示UIImagePickerController(通常以模態(tài)窗口形式打開)乾戏。?
7,拍照和錄制視頻結束后在代理方法中展示/保存照片或視頻三热。
具體代碼示例看這里鼓择,CSDN的大神們講的很清楚。
AVFoundation怎么用就漾?
我手里的app用的AVFoundation呐能,下面是我對AVFoundation的使用心得。這里有官方給的文字指導抑堡。一般人看這個可能比較費勁摆出,我用接地氣兒的話給解釋一遍。
如圖所示(這是中文教科書中最坑爹的一句話)首妖,簡單地說結構分3層偎漫,最上面一層是輸入,最下面一層是輸出有缆,中間需要一個Session來連接象踊。這些類的名字全是AVCapture開頭(跟SOD開頭是一個道理,一看名字就知道是什么棚壁,別往下問了杯矩。。)袖外。
輸入:
AVCaptureDevice, 就是問是麥克風史隆?還是攝像頭?
創(chuàng)建:_yourDevice =?[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //設備是攝像頭曼验,因為我要拍照
AVCaptureDeviceInput, 這個用來輸入逆害。你對麥克喊一聲“我要吃煎餅!”蚣驼。AVCaptureDevice是麥克風魄幕,輸入“我要吃煎餅!”的方法是通過AVCaptureDeviceInput颖杏。
創(chuàng)建:_yourInput = [AVCaptureDeviceInput deviceInputWithDevice:_yourDevice error:nil]; //這里需要device纯陨,所以要先創(chuàng)建device
輸出:
AVCaptureOutput,這個厲害了,看你輸出的是什么翼抠。如果是音頻咙轩,例如“我要吃煎餅!”,就是AVCaptureAudioFileOutput阴颖,如果是拍你吃煎餅的視頻是AVCaptureMovieFileOutput活喊。我們做的是圖像,用AVCapturePhotoOutput量愧。
創(chuàng)建:_yourOutput = [[AVCapturePhotoOutput alloc] init];
Session:
這個最抽象钾菊,他相當于一個有幾個state的攝像機。你需要把輸入偎肃,輸出全都加進去煞烫,配置一下,打開Session就可以了累颂。每樣就一行命令滞详。
創(chuàng)建:
_yourSession = [[AVCaptureSession alloc] init];
?[_yourSession beginConfiguration]; //是的,開始配置也要交方程
設置輸入:
if( [_yourSession canAddInput:_yourInput] ) {
? ? ?[_yourSession addInput:_yourInput];
}
設分辨率:
if( [_yourSession canSetSessionPreset:preset] ) {
? ? ? ? ? ? [_yourSession setSessionPreset:preset];
? ? ? ? }
?else if( [_yourSession canSetSessionPreset:AVCaptureSessionPreset640x480] ) {
? ? ? ? ? ? [_yourSession setSessionPreset:AVCaptureSessionPreset640x480]; //這里設置你需要的分辨率
}
設置輸出:
if([_yourSession canAddOutput:_yourOutput]) {
? ? ? ? ? ? [_yourSession addOutput:_yourOutput];
}
最后別忘了commit你的配置:
[_yourSession commitConfiguration];
預覽:
AVCaptureVideoPreviewLayer紊馏,你在開攝像頭的時候料饥,按快門之前,屏幕可以看到攝像頭傳來的影像對吧朱监。那個就是這個岸啡。這個預覽和viewController有關,需要在main.storyboard里創(chuàng)建view組件赌朋,ctrl拉出property凰狞,把這個property傳過來設置預覽。這個也需要你在建立了Session之后加入沛慢。
創(chuàng)建:_yourPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_yourSession];
你的view組件弄好之后赡若,設置預覽:
if(_previewLayer) {
? ? ? ? _yourPreviewLayer.frame = imageView.bounds;//設置預覽窗口大小與view組件大小相等
? ? ? ? _yourPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;//重力感知設置,你轉手機方向团甲,屏幕切換會resize
? ? ? ? [imageView.layer addSublayer:_yourPreviewLayer];
}
都弄完了逾冬,如果你要開始拍攝了,就交方程開始
if (![_captureSession isRunning]) { //這段一般寫在viewWillAppear里
? ? ? ? [_yourSession startRunning];
? ? }
停止也一樣
if ([_captureSession isRunning]) { //這段一般寫在viewWillDisappear里
? ? ? ? [_yourSession stopRunning];
? ? }
看完了是不是覺得Session有點像數(shù)據(jù)庫的Session躺苦,或者Source Control的用法身腻。配置完了要commit才行。
如果需要音頻匹厘,錄音嘀趟,視頻錄制和播放的話,看這里愈诚。
第二部分講圖像的數(shù)據(jù)流向她按。
ref:?
http://blog.csdn.net/u012988591/article/details/54947753
http://www.cnblogs.com/kenshincui/p/4186022.html
https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html
http://www.cnblogs.com/kenshincui/p/4186022.html