關(guān)于iOS中簡(jiǎn)單實(shí)現(xiàn)調(diào)用系統(tǒng)相機(jī)及相冊(cè)功能

在iOS中要拍照和錄制視頻最簡(jiǎn)單的方式就是調(diào)用UIImagePickerController,UIImagePickerController繼承與UINavigationController,需要使用代理方法時(shí)需要同時(shí)遵守這兩個(gè)協(xié)議,以前可能比較多的是使用UIImagePickerController來選擇相冊(cè)圖片或者拍攝圖片,其實(shí)它的功能還能用來拍攝視頻。

使用UIImagePickerController拍照或者拍視頻主要以下幾個(gè)步驟:

  • 創(chuàng)建一個(gè)全局的UIImagePickerController對(duì)象。

  • 指定UIImagePickerController的來源sourceType,是來自UIImagePickerControllerSourceTypeCamera相機(jī),還是來自UIImagePickerControllerSourceTypePhotoLibrary相冊(cè)。

  • 然后是設(shè)置mediaTypes媒體類型,這是錄制視頻必須設(shè)置的選項(xiàng),默認(rèn)情況下是kUTTypeImage(注意:mediaTypes的設(shè)置是在MobileCoreServices框架下),同還可以設(shè)置一些其他視頻相關(guān)的屬性,例如:videoQuality視頻的質(zhì)量、videoMaximumDuration視頻的最大錄制時(shí)長(zhǎng)(默認(rèn)為10s),cameraDevice攝像頭的方向(默認(rèn)為后置相機(jī))。

  • 指定相機(jī)的捕獲模式cameraCaptureMode,設(shè)置mediaTypes后在設(shè)置捕獲模式,注意的是捕獲模式需要在相機(jī)來源sourceType為相機(jī)時(shí)設(shè)置,否則會(huì)出現(xiàn)crash。

  • 適時(shí)的展示UIImagePickerController,然后在相應(yīng)的代理方法保存和獲取圖片或視頻。

下面還是上代碼吧,更加清晰明了...
首先需要導(dǎo)入以下用到的幾個(gè)頭文件,同時(shí)遵守兩個(gè)代理方法

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
{
    UIImagePickerController *_imagePickerController;
}

創(chuàng)建UIImagePickerController對(duì)象

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib
   
    _imagePickerController = [[UIImagePickerController alloc] init];
    _imagePickerController.delegate = self;
    _imagePickerController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    _imagePickerController.allowsEditing = YES;
    

從攝像頭獲取圖片或視頻

#pragma mark 從攝像頭獲取圖片或視頻
- (void)selectImageFromCamera
{
    _imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    //錄制視頻時(shí)長(zhǎng),默認(rèn)10s
    _imagePickerController.videoMaximumDuration = 15;

    //相機(jī)類型(拍照、錄像...)字符串需要做相應(yīng)的類型轉(zhuǎn)換
    _imagePickerController.mediaTypes = @[(NSString *)kUTTypeMovie,(NSString *)kUTTypeImage];

    //視頻上傳質(zhì)量
    //UIImagePickerControllerQualityTypeHigh高清
    //UIImagePickerControllerQualityTypeMedium中等質(zhì)量
    //UIImagePickerControllerQualityTypeLow低質(zhì)量
    //UIImagePickerControllerQualityType640x480
    _imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

    //設(shè)置攝像頭模式(拍照,錄制視頻)為錄像模式
    _imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
    [self presentViewController:_imagePickerController animated:YES completion:nil];
}

從相冊(cè)獲取圖片或視頻

#pragma mark 從相冊(cè)獲取圖片或視頻
- (void)selectImageFromAlbum
{
    //NSLog(@"相冊(cè)");
    _imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    [self presentViewController:_imagePickerController animated:YES completion:nil];
}

在imagePickerController:didFinishPickingMediaWithInfo:代理方法中處理得到的資源,保存本地并上傳...

#pragma mark UIImagePickerControllerDelegate
//該代理方法僅適用于只選取圖片時(shí)
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo {
    NSLog(@"選擇完畢----image:%@-----info:%@",image,editingInfo);
}
//適用獲取所有媒體資源,只需判斷資源類型
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    //判斷資源類型
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]){
        //如果是圖片
        self.imageView.image = info[UIImagePickerControllerEditedImage];
        //壓縮圖片
        NSData *fileData = UIImageJPEGRepresentation(self.imageView.image, 1.0);
        //保存圖片至相冊(cè)
        UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
        //上傳圖片
        [self uploadImageWithData:fileData];
        
    }else{
        //如果是視頻
        NSURL *url = info[UIImagePickerControllerMediaURL];
        //播放視頻
        _moviePlayer.contentURL = url;
        [_moviePlayer play];
        //保存視頻至相冊(cè)(異步線程)
        NSString *urlStr = [url path];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
                
                UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
            }
        });
        NSData *videoData = [NSData dataWithContentsOfURL:url];
        //視頻上傳
        [self uploadVideoWithData:videoData];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

圖片和視頻保存完畢后的回調(diào)

#pragma mark 圖片保存完畢的回調(diào)
- (void) image: (UIImage *) image didFinishSavingWithError:(NSError *) error contextInfo: (void *)contextInf{
    
}

#pragma mark 視頻保存完畢的回調(diào)
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInf{
    if (error) {
        NSLog(@"保存視頻過程中發(fā)生錯(cuò)誤,錯(cuò)誤信息:%@",error.localizedDescription);
    }else{
        NSLog(@"視頻保存成功.");
    }
}

以上僅是簡(jiǎn)單功能的實(shí)現(xiàn),還有例如切換前后攝像頭、閃光燈設(shè)置、對(duì)焦、曝光模式等更多功能...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容