美文网首页OC开发资料收集区
ios 摄像头应用+相册

ios 摄像头应用+相册

作者: oc123 | 来源:发表于2017-05-27 10:02 被阅读29次

    本文介绍一些关于摄像头和相册的基本用法,在调用摄像头之前,不要忘记检测摄像头是否可用;
    首先导入系统文件

    #import <AVFoundation/AVFoundation.h>
    

    调用系统摄像头、相册,遵循代理:

    <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(@"保存视频过程中发生错误,错误信息:%@",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)];//该区域请自行调整
            [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)];
            //从现在绘制的图片 的上下文中 获取绘制好的图片
            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的字符串,存到数据库中或者plist文件中 */
        //将图片(NSData类型)转换为Base64的字符串
        NSString *image64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];//该base64码用工具是不能直接转换出图片的,要加上请求头data:image/png;base64,
    
        /**   注意!
          *   如果需要上传更新图片,在此处进行相应操作
         */
    
       /** 给headImv.image赋值 */
        self.headImv.image = [UIImage imageWithData:imageData];
      //如果要缓存图片,可用NSUserDefault对imageData(二进制数据)进行缓存,注意直接缓存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//视频录制需用麦克风
    

    如果对您有帮助,请不吝关注,您的关注是我不断分享的动力;

    相关文章

      网友评论

        本文标题:ios 摄像头应用+相册

        本文链接:https://www.haomeiwen.com/subject/eagffxtx.html