ios 攝像頭應用+相冊

本文介紹一些關于攝像頭和相冊的基本用法,在調用攝像頭之前,不要忘記檢測攝像頭是否可用;
首先導入系統(tǒng)文件

#import <AVFoundation/AVFoundation.h>

調用系統(tǒng)攝像頭、相冊,遵循代理:

<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

檢測攝像頭可用性,代碼如下:

#pragma mark - 攝像頭可用性檢測
// 判斷攝像頭是否可用
- (BOOL) ifCameraAvailable{
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
// 前置攝像頭是否可用
- (BOOL) ifFrontCameraAvailable{
    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
}

// 后置攝像頭是否可用
- (BOOL) ifRearCameraAvailable{
    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
}
#pragma mark - 調用攝像頭
//判別是否有2個攝像頭
- (BOOL) hasMultipleCameras {
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    if (devices != nil && [devices count] > 1) return YES;
    return NO;
}
//獲取相應位置的攝像頭焦點
- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition) position
{
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices )
        if ( device.position == position )
            return device;
    return nil ;
}

調用攝像頭代碼:

//啟用攝像頭拍照
-(void)startUsingCamera{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        UIImagePickerController *pickerCtl = [[UIImagePickerController alloc]init];
        pickerCtl.delegate = self;
        pickerCtl.allowsEditing = YES;
        pickerCtl.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentViewController:pickerCtl animated:YES completion:nil];
    }
}
//啟用攝像頭錄像
-(void)startUsingCameraForVideo1{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        UIImagePickerController *pickerCtl = [[UIImagePickerController alloc]init];
        pickerCtl.delegate = self;
        pickerCtl.allowsEditing = YES;
        pickerCtl.sourceType = UIImagePickerControllerSourceTypeCamera;
        pickerCtl.cameraDevice = UIImagePickerControllerCameraDeviceFront;//設置使用哪個攝像頭,此處設置前置
        pickerCtl.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
        pickerCtl.videoQuality = UIImagePickerControllerQualityTypeIFrame1280x720;
        pickerCtl.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;//設置攝像頭使用模式(拍照、錄像)
        
        [self presentViewController:pickerCtl animated:YES completion:nil];
    }else{
        NSLog(@"攝像頭不可用!");
    }
}
//視頻保存后的回調
- (void)saveVideo:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error) {
        NSLog(@"保存視頻過程中發(fā)生錯誤,錯誤信息:%@",error.localizedDescription);
    }else{
        NSLog(@"視頻保存成功.");
        //錄制完之后自動播放
        NSURL *url=[NSURL fileURLWithPath:videoPath];
        AVPlayer *player=[AVPlayer playerWithURL:url];//@property (strong ,nonatomic) AVPlayer *player;//播放器,用于錄制完視頻后播放視頻
        AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:player];
        UIImageView *videoPlayer = [[UIImageView alloc] initWithFrame:CGRectMake(20, 50, self.view.frame.size.width - 40, 100)];//該區(qū)域請自行調整
        [self.view addSubview:videoPlayer];
        
        playerLayer.frame = videoPlayer.frame;
        [videoPlayer.layer addSublayer:playerLayer];
        [player play];
        
    }
}

/**  ------------ 分割線 ------------  */
#pragma mark - UIImagePickerControllerDelegate
//完成時
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照
        UIImage *image;
        //如果允許編輯則獲得編輯后的照片,否則獲取原始照片
        /*
        if (picker.allowsEditing) {
            image=[info objectForKey:UIImagePickerControllerEditedImage];//獲取編輯后的照片
        }else{
            
        }
         */
        image=[info objectForKey:UIImagePickerControllerOriginalImage];//獲取原始照片
//        [self.photo setImage:image];//photo是UIImageView 顯示照片
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存到相簿
    }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是錄制視頻
        NSLog(@"video...");
        NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//視頻路徑
        //NSData *data = [NSData dataWithContentsOfURL:url];//轉化視頻為NSData用于上傳

        NSString *urlStr=[url path];
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
            //保存視頻到相簿,注意也可以使用ALAssetsLibrary來保存
            UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(saveVideo:didFinishSavingWithError:contextInfo:), nil);//保存視頻到相簿
        }
        //如果錄制的視頻需要上傳服務器在此進行操作
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

調用相冊代碼:

//啟用相冊
-(void)startUsingAlbum{
    UIImagePickerController *pickerCtl = [[UIImagePickerController alloc]init];
    pickerCtl.delegate = self;
    pickerCtl.allowsEditing = YES;
    pickerCtl.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:pickerCtl animated:YES completion:nil];
}

由于所取圖片尺寸大小不一,所以需要對圖片進行相應處理,代碼如下:

/** 壓縮圖片 */
-(UIImage *)thumbnaiWithImage:(UIImage *)image size:(CGSize)size{
    UIImage *newImage = nil;
    if (image != nil) {
        //獲取 要開始繪制的圖片(尺寸大?。┑纳舷挛?        UIGraphicsBeginImageContext(size);
        //繪制size大小的圖片
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        //從現(xiàn)在繪制的圖片 的上下文中 獲取繪制好的圖片
        newImage = UIGraphicsGetImageFromCurrentImageContext();
        //關閉 繪制圖片的上下文
        UIGraphicsEndImageContext();
    }
    return newImage;
}
/** 對imageView進行圖片壓縮,并給Imv賦值 */
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    //獲取 原始圖片
    UIImage *originalImage = info[UIImagePickerControllerOriginalImage];
    //進行圖片壓縮,尺寸
    UIImage *compressImage = [self thumbnaiWithImage:originalImage size:CGSizeMake(170, 170)];
    //將壓縮的圖片 轉化為 NSData,以便上傳 頭像信息,縮小為0.1倍
    NSData *imageData = UIImageJPEGRepresentation(compressImage, 0.1);
    
    /** 將圖片轉化為base64的字符串,存到數(shù)據(jù)庫中或者plist文件中 */
    //將圖片(NSData類型)轉換為Base64的字符串
    NSString *image64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];//該base64碼用工具是不能直接轉換出圖片的,要加上請求頭data:image/png;base64,

    /**   注意!
      *   如果需要上傳更新圖片,在此處進行相應操作
     */

   /** 給headImv.image賦值 */
    self.headImv.image = [UIImage imageWithData:imageData];
  //如果要緩存圖片,可用NSUserDefault對imageData(二進制數(shù)據(jù))進行緩存,注意直接緩存image是崩潰的!

    [self dismissViewControllerAnimated:YES completion:nil];
}

另注:將英文提示轉成中文提示,方法如下;
在 Info.plist 中
Localization native development region 設為 China

語言設置截圖.png

最后要在info.plist中添加授權,如下

Privacy - Camera Usage Description//攝像頭
Privacy - Photo Library Usage Description//相冊
Privacy - Microphone Usage Description//視頻錄制需用麥克風

如果對您有幫助,請不吝關注,您的關注是我不斷分享的動力;

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容