iOS開發(fā)之UIImagePickerController(拍照和錄像)

正文

在iOS應用的開發(fā)中我們經(jīng)常會用到拍照和錄像的功能,拍完照片返回照片文件?或者直接在相冊中選擇需要的圖片?要實現(xiàn)相關的功能我們經(jīng)常會用到UIImagePickerController或者ALAssetsLibrary亦或者AVFoundation,在這里主要講解使用UIImagePickerController來拍照和錄像并且保存在相冊中的實現(xiàn)。

圖1-1 拍照和錄像.png

具體的實現(xiàn)步驟如下:

  • 在info.plist文件中配置相機麥克風和相冊的隱私訪問請求。
  • 判斷設備是否支持錄像和拍照。
  • 設置UIImagePickerController的資源類型。
  • 設置媒體類型多媒體格式(聲音和視頻)/照片
  • 設置UIImagePickerController的其他屬性例如:最大時長、錄像的質(zhì)量、閃光燈類型等。
  • 遵循UINavigationControllerDelegate,UIImagePickerControllerDelegate代理,并設置代理。
  • 在代理方法- imagePickerController: didFinishPickingMediaWithInfo: 中拿到獲取的媒體資源,并進行相關的操作。

廢話少說直接上代碼:
新建一個控制器并且按照上面的步驟設置UIImagePickerController相關的屬性并設置代理:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //判斷錄影功能是否可用
    if (![self isVideoRecordingAvailable]) {
        return;
    }
    
    /*設置資源類型為相機
     *UIImagePickerControllerSourceType枚舉
     *UIImagePickerControllerSourceTypeCamera 來自攝像頭
     *UIImagePickerControllerSourceTypePhotoLibrary 來自圖庫
     *UIImagePickerControllerSourceTypeSavedPhotosAlbum 來自相機相冊
     */
    self.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    //媒體類型多媒體格式(聲音和視頻)/照片
    self.mediaTypes = @[(NSString *)kUTTypeMovie,(NSString *)kUTTypeImage];
    // 設置是否可以管理已經(jīng)存在的圖片或者視頻
    [self setAllowsEditing:YES];
    
    //設置錄制的最大時長,默認是10分鐘
    self.videoMaximumDuration = 10;
    //設置錄像的質(zhì)量
    self.videoQuality = UIImagePickerControllerQualityType640x480;
    //設置閃光燈類型
    self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;

    //設置代理
    self.delegate = self;    
}

#pragma mark 判斷是否支持所需引用的sourceType:相機,同時可用的媒體類型是否包含kUTTypeMovie錄影和照相
- (BOOL)isVideoRecordingAvailable{
    //相機是否可用
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        //相機所包含的媒體類型
        NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
        //是否包含抽象的多媒體格式(聲音和視頻) (注:kUTTypeMovie包含聲音和視頻 kUTTypeVideo只包含視頻 kUTTypeAudio只包含聲音)
        if ([availableMediaTypes containsObject:(NSString *)kUTTypeMovie]&&[availableMediaTypes containsObject:(NSString *)kUTTypeImage]) {
            return YES;
        }
    }
    return NO;
}

通過UIImagePickerController的代理方法- imagePickerController: didFinishPickingMediaWithInfo: 中拿到獲取的媒體資源,并存進相冊:

#pragma mark UIImagePickerControllerDelegate 
//獲得媒體資源信息并保存到相冊
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    //獲取當前媒體資源的類型
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){
        UIImage *theImage = nil;
        // 判斷,圖片是否允許修改
        if ([picker allowsEditing]){
            //獲取用戶編輯之后的圖像
            theImage = [info objectForKey:UIImagePickerControllerEditedImage];
        } else {
            // 照片的元數(shù)據(jù)參數(shù)
            theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
            
        }
        
        // 保存圖片到相冊中
        SEL selectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);
        UIImageWriteToSavedPhotosAlbum(theImage, self,selectorToCall, @"圖片保存成功");

    }else{
    //創(chuàng)建ALAssetsLibrary對象
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    //獲取視頻文件的url
    NSURL *savedUrl = [info objectForKey:UIImagePickerControllerMediaURL];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:savedUrl]) {
        //將視頻保存到相冊
        [library writeVideoAtPathToSavedPhotosAlbum:savedUrl completionBlock:nil];
    }
    
    }
    //保存成功后退出頁面
    [picker dismissViewControllerAnimated:YES completion:nil];
}
//當用戶取消時,調(diào)用該方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

另外,我們除了可以利用UIImagePickerController自帶的拍照或者錄制視頻的CameraControls外,我們可以隱藏他們來自定義UI。

隱藏系統(tǒng)默認的CameraControls:

/*
     *我們也可以自定義攝像機UI
     */
    //隱藏系統(tǒng)自帶的UI
    self.showsCameraControls = NO;
    
    //設置全屏錄制
//    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
//    float aspectRatio = 4.0/3.0;
//    float scale = screenSize.height/screenSize.width * aspectRatio;
//    self.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);

當我們自定義攝像機CameraControls時可能會用到的方法:

#pragma mark 當我們自定義攝像機CameraControls時可能會用到的方法
//開始錄制/拍照
- (void)startRecorder
{
    [self startVideoCapture];
    //拍照
    //    [self takePicture];
}
//停止錄制
- (void)stopRecoder
{
    [self stopVideoCapture];
}
//切換前后攝像頭
- (void)switchCameraIsFront:(BOOL)front
{
    if (front) {
        if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){
            [self setCameraDevice:UIImagePickerControllerCameraDeviceFront];
        }
    }else{
        if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]){
            [self setCameraDevice:UIImagePickerControllerCameraDeviceRear];
        }
    }
}

//隱藏系統(tǒng)自帶的UI,可以自定義UI
- (void)configureCustomUIOnImagePicker
{
    UIView *cameraOverlay = [[UIView alloc] init];
    self.cameraOverlayView = cameraOverlay;
}

結(jié)語

除了用UIImagePickerController來拍照和錄像,我們用到的更多的可能是從相冊選擇照片和視頻,只要將資源來源設為UIImagePickerControllerSourceTypePhotoLibrary或者UIImagePickerControllerSourceTypeSavedPhotosAlbum即可,并且對屬性做相對應的修改即可。

人生太短,歲月太長。生活是公平的,要活出精彩,需要一顆奮進的心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容