ios 摄像头应用+相册

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

#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//视频录制需用麦克风

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容