打開(kāi)相機(jī):
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供滁州網(wǎng)站建設(shè)、滁州做網(wǎng)站、滁州網(wǎng)站設(shè)計(jì)、滁州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、滁州企業(yè)網(wǎng)站模板建站服務(wù),十多年滁州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
[cpp] view plain copy
//先設(shè)定sourceType為相機(jī),然后判斷相機(jī)是否可用(ipod)沒(méi)相機(jī),不可用將sourceType設(shè)定為相片庫(kù)
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
// if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
// sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// }
//sourceType = UIImagePickerControllerSourceTypeCamera; //照相機(jī)
//sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //圖片庫(kù)
//sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; //保存的相片
UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化
picker.delegate = self;
picker.allowsEditing = YES;//設(shè)置可編輯
picker.sourceType = sourceType;
[self presentModalViewController:picker animated:YES];//進(jìn)入照相界面
[picker release];
打開(kāi)相冊(cè):(區(qū)分pad和iphone)
for iphone:
[cpp] view plain copy
UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
pickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//pickerImage.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];
}
pickerImage.delegate = self;
pickerImage.allowsEditing = NO;
[self presentModalViewController:pickerImage animated:YES];
[pickerImage release];
for ipad:
[cpp] view plain copy
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; //保存的相片
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = NO;//是否允許編輯
picker.sourceType = sourceType;
/*
如果從一個(gè)導(dǎo)航按鈕處呈現(xiàn),使用:
presentPopoverFromBarButtonItem:permittedArrowDirections:animated:;
如果要從一個(gè)視圖出呈現(xiàn),使用:
presentPopoverFromRect:inView:permittedArrowDirections:animated:
如果設(shè)備旋轉(zhuǎn)以后,位置定位錯(cuò)誤需要在父視圖控制器的下面方法里面重新定位:
didRotateFromInterfaceOrientation:(在這個(gè)方法體里面重新設(shè)置rect)
然后再次調(diào)用:
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated
*/
//UIPopoverController只能在ipad設(shè)備上面使用;作用是用于顯示臨時(shí)內(nèi)容,特點(diǎn)是總是顯示在當(dāng)前視圖最前端,當(dāng)單擊界面的其他地方時(shí)自動(dòng)消失。
UIPopoverController *popover = [[UIPopoverController alloc]initWithContentViewController:picker];
self.imagePicker = popover;
//permittedArrowDirections 設(shè)置箭頭方向
[self.imagePicker presentPopoverFromRect:CGRectMake(0, 0, 300, 300) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[picker release];
[popover release];
點(diǎn)擊相冊(cè)中的圖片 貨照相機(jī)照完后點(diǎn)擊use 后觸發(fā)的方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
*)info
點(diǎn)擊cancel 調(diào)用的方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
該框架框架包含視頻相關(guān)的APIs和音頻相關(guān)的APIs。
針對(duì)音頻及視頻,其主要提供的功能可以歸納為4各方面:
1)、Capture
音頻、視頻、圖像媒體的捕捉,并輸出我們可用的數(shù)據(jù)對(duì)象的過(guò)程。
2)、Edit
針對(duì)現(xiàn)有的媒體片段(音頻片段或視頻片段),重新創(chuàng)建Assets,重新加工、生成新的媒體片段。例如,Reading, Writing, Reencoding Assets, Thumbnails
3)、Export
提供導(dǎo)出音視頻的API。例如,修改文件格式、消減時(shí)長(zhǎng)等。
4)、Presentation
例如,播放、音視頻的預(yù)覽
設(shè)備的輸入源主要包括:麥克風(fēng)(Microphone),攝像頭(Camera),屏幕等
輸入源一般包括:AVCaptureVideoPreviewLayer,AVCaptureAudioPreviewOutput,文件、Raw Buffer等。
從一個(gè)設(shè)備,例如照相機(jī)或者麥克風(fēng)管理捕獲,組合對(duì)象來(lái)表示輸入和輸出,并使用 AVCaptureSession 的實(shí)例來(lái)協(xié)調(diào)它們之間的數(shù)據(jù)流。
一個(gè)簡(jiǎn)單的會(huì)話協(xié)調(diào):
AVCapture Session作為整個(gè)Capture的核心,不斷從輸入源獲取數(shù)據(jù),然后分發(fā)給各個(gè)輸出源,從而完成一次簡(jiǎn)單的會(huì)話。
AVCaptureSession參數(shù)配置
開(kāi)始會(huì)話
結(jié)束會(huì)話
然而,很多情況下,需要考慮多個(gè)輸入源是如何被表示以及如何連接到輸出。
輸入源有自己的硬件參數(shù)可以設(shè)置流控,輸出源作為一個(gè)被動(dòng)接受對(duì)象,它并沒(méi)有太多流控設(shè)置,所以蘋(píng)果巧妙的引入AVCaptureConnections。每個(gè)Output與Session建立連接后,都會(huì)分配一個(gè)默認(rèn)的AVCpatureConnection。
AVCaptureConnections就是Session和Output中間的控制節(jié)點(diǎn)。很多實(shí)時(shí)數(shù)據(jù),也都是從connection得到的。
輸入設(shè)備的配置
輸出的配置
接收輸出資源
1)、視頻
2)、照片輸出
if (is_ios7) {
AVAuthorizationStatus authstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authstatus ==AVAuthorizationStatusRestricted || authstatus ==AVAuthorizationStatusDenied) //用戶關(guān)閉了權(quán)限
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"請(qǐng)?jiān)谠O(shè)備的設(shè)置-隱私-相機(jī)中允許訪問(wèn)相機(jī)。" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil];
[alert show];
return;
}
ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus];
if (author == kCLAuthorizationStatusRestricted || author ==kCLAuthorizationStatusDenied)//用戶關(guān)閉了權(quán)限
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"請(qǐng)?jiān)谠O(shè)備的設(shè)置-隱私-照片中允許訪問(wèn)照片。" delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil];
[alert show];
return;
}
}
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//相冊(cè)是可以用模擬器打開(kāi)
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
[self presentViewController:picker animated:YES completion:nil];
}else{
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"Error" message:@"沒(méi)有相冊(cè)" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[alter show];
}
}else{
[MBProgressHUD showMessag:@"無(wú)法打開(kāi)相機(jī)" toView:Main_WINDOW];
NSLog(@"模擬器無(wú)法打開(kāi)相機(jī)");
}
最近在接入一個(gè)拍照翻譯的api時(shí),發(fā)現(xiàn)用自帶相機(jī)拍攝的照片傳上去時(shí)返回的文字的rect對(duì)不上,而去相冊(cè)里把照片截屏再上傳之又是正常的,在排查了一段時(shí)間之后終于在輸出照片的大小時(shí)發(fā)現(xiàn)了端倪
在用上面的方法輸出圖片的高度和寬度時(shí),發(fā)現(xiàn)用相機(jī)拍攝的照片輸出的寬度居然大于高度,可UIimageView里顯示的照片明顯是高度比寬度大一些的,于是上網(wǎng)搜索有關(guān)資料,果不其然:
最坑的地方在于,UIimageView在使用照片的時(shí)候會(huì)自動(dòng)旋轉(zhuǎn)回來(lái),這給人的誤導(dǎo)就是如果不通過(guò) CGImageGetHeight 的方式輸出照片的寬高,根本無(wú)法發(fā)現(xiàn)這個(gè)問(wèn)題!因?yàn)槟憧吹狡聊簧巷@示的圖片確實(shí)是正常的
知道了原因,解決起來(lái)就簡(jiǎn)單了,給UIImage寫(xiě)一個(gè)分類解決這個(gè)問(wèn)題:
使用時(shí),直接調(diào)用 - (UIImage *)fixOrientation 方法即可
你可能這App Store中搜到過(guò)很多AI相機(jī)App,提供各種AI變臉特效,這些功能都是怎樣實(shí)現(xiàn)的呢?我們自己能不能開(kāi)發(fā)一款相近功能的App呢?
出于這樣的想法,就有了“魔法相機(jī)”這個(gè)開(kāi)源項(xiàng)目。接下來(lái)的一段時(shí)間里,我會(huì)不斷更新這個(gè)系列文章,和大家分享開(kāi)發(fā)過(guò)程和各種技術(shù)細(xì)節(jié),希望能對(duì)大家有幫助。
魔法相機(jī)是一款基于SwiftUI和CoreML開(kāi)發(fā)的 iOS AI 相機(jī)應(yīng)用,實(shí)現(xiàn)了下列功能:
項(xiàng)目地址: william0wang/MagicCamera (github.com)
首先,計(jì)劃未來(lái)一段時(shí)間,把開(kāi)發(fā)過(guò)程中的心得和各種技術(shù)細(xì)節(jié)通過(guò)文章分享給大家,希望對(duì)大家能用幫助。
在功能方面,當(dāng)前已經(jīng)實(shí)現(xiàn)了AI相機(jī)App最流行的拍照功能。后續(xù)計(jì)劃會(huì)增加更多視頻相關(guān)功能,例如視頻變臉等。