博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS调用系统摄像头和相册
阅读量:6839 次
发布时间:2019-06-26

本文共 8253 字,大约阅读时间需要 27 分钟。

hot3.png

在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频。并且从相册中选取我们需要的图片或者视频。

关于iOS摄像头和相册的应用,可以使用UIImagePickerController类来完成控制。

关于UIImagePickerController的相关知识,

如下:

iOS的一些设备上都安装了摄像头。现在绝大多数都有了。

在编程中,我们是用相应的东西来进行照相,录像等功能。

一、UIImagePickerController

UIImagePickerController 这个类可以为大家提供照相的功能,以及图片,视频浏览的功能。 

二、检查硬件是否安装有摄像头或者允许操作相册

这些公共的方法,我们也许会用到,我就贴了!So easy!!!

#pragma mark - 摄像头和相册相关的公共类

// 判断设备是否有摄像头

- (BOOL) isCameraAvailable{

   return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}

// 前面的摄像头是否可用

- (BOOL) isFrontCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];

}

// 后面的摄像头是否可用

- (BOOL) isRearCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];

}

// 判断是否支持某种多媒体类型:拍照,视频

- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{

   __block BOOL result = NO;

   if ([paramMediaType length] == 0){

     NSLog(@"Media type is empty.");

     return NO;

  }

   NSArray *availableMediaTypes =[UIImagePickerControlleravailableMediaTypesForSourceType:paramSourceType];

  [availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {

                             NSString *mediaType = (NSString *)obj;

                             if ([mediaTypeisEqualToString:paramMediaType]){

                              result = YES;

                              *stop= YES;

                            }

     

  }];

   return result;

}

// 检查摄像头是否支持录像

- (BOOL) doesCameraSupportShootingVideos{

   return [self cameraSupportsMedia:( NSString *)kUTTypeMoviesourceType:UIImagePickerControllerSourceTypeCamera];

}

// 检查摄像头是否支持拍照

- (BOOL) doesCameraSupportTakingPhotos{

   return [self cameraSupportsMedia:( NSString *)kUTTypeImagesourceType:UIImagePickerControllerSourceTypeCamera];

}

#pragma mark - 相册文件选取相关

//相册是否可用

- (BOOL) isPhotoLibraryAvailable{

   return [UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];

}

//是否可以在相册中选择视频

- (BOOL) canUserPickVideosFromPhotoLibrary{

   return [selfcameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}

//是否可以在相册中选择视频

- (BOOL) canUserPickPhotosFromPhotoLibrary{

   return [selfcameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}

三、用摄像头进行拍照和录像功能

1.我们将UIImagePickerController功能写在一个按钮的点击事件中:

 

#pragma mark -拍照按钮事件

- (void)ClickControlAction:(id)sender{

   //判断有摄像头,并且支持拍照功能

  if ([selfisCameraAvailable] && [selfdoesCameraSupportTakingPhotos]){

     // 初始化图片选择控制器

    UIImagePickerController *controller = [[UIImagePickerController alloc]init];

    [controllersetSourceType:UIImagePickerControllerSourceTypeCamera];//设置类型

     

    //设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以

    NSString *requiredMediaType = (NSString *)kUTTypeImage;

    NSString *requiredMediaType1 = (NSString *)kUTTypeMovie;

    NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];

    [controller setMediaTypes:arrMediaTypes];

     

     // 设置录制视频的质量

    [controllersetVideoQuality:UIImagePickerControllerQualityTypeHigh];

     //设置最长摄像时间

    [controller setVideoMaximumDuration:10.f];

     

    [controller setAllowsEditing:YES];//设置是否可以管理已经存在的图片或者视频

    [controller setDelegate:self];// 设置代理

    [self.navigationControllerpresentModalViewController:controller animated:YES];

    [controller release];

  }else {

     NSLog(@"Camera is not available.");

  }

}

解释:

2. setSourceType方法

通过设置setSourceType方法可以确定调用出来的UIImagePickerController所显示出来的界面

typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {

  UIImagePickerControllerSourceTypePhotoLibrary,

  UIImagePickerControllerSourceTypeCamera,

  UIImagePickerControllerSourceTypeSavedPhotosAlbum

};

分别表示:图片列表,摄像头,相机相册

3.setMediaTypes方法

// 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以

     NSString *requiredMediaType = ( NSString *)kUTTypeImage;

     NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;

     NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];

    [controller setMediaTypes:arrMediaTypes];

4.关于UIImagePickerControllerDelegate协议

我们要对我们拍摄的照片和视频进行存储,那么就要实现UIImagePickerControllerDelegate协议的方法。

#pragma mark - UIImagePickerControllerDelegate 代理方法

//保存图片后到相册后,调用的相关方法,查看是否保存成功

- (void) imageWasSavedSuccessfully:(UIImage *)paramImage didFinishSavingWithError:(NSError *)paramError contextInfo:(void*)paramContextInfo{

  if (paramError == nil){

     NSLog(@"Image was saved successfully.");

  } else {

     NSLog(@"An error happened while saving the image.");

    NSLog(@"Error = %@", paramError);

  }

}

//当得到照片或者视频后,调用该方法

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

   NSLog(@"Picker returned successfully.");

  NSLog(@"%@", info);

   NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

   // 判断获取类型:图片

  if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){

    UIImage*theImage = nil;

     // 判断,图片是否允许修改

    if ([pickerallowsEditing]){

       //获取用户编辑之后的图像

      theImage = [info objectForKey:UIImagePickerControllerEditedImage];

    } else {

      // 照片的元数据参数

      theImage = [info objectForKey:UIImagePickerControllerOriginalImage];

       

    }

     

     // 保存图片到相册中

    SELselectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);

    UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall,NULL);

     

  }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){

     // 判断获取类型:视频

     //获取视频文件的url

     NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];

     //创建ALAssetsLibrary对象并将视频保存到媒体库

    // Assets Library 框架包是提供了在应用程序中操作图片和视频的相关功能。相当于一个桥梁,链接了应用程序和多媒体文件。

    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

     // 将视频保存到相册中

    [assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:mediaURL

                     completionBlock:^(NSURL *assetURL, NSError *error) {

                       if (!error) {

                         NSLog(@"captured video saved with no error.");

                       }else{

                         NSLog(@"error occured while saving the video:%@", error);

                       }

                     }];

    [assetsLibrary release];

   

   

  }

   

   

  [picker dismissModalViewControllerAnimated:YES];

}

//当用户取消时,调用该方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker{

   

  [picker dismissModalViewControllerAnimated:YES];

}

四、从相册获取图片和视频数据

1.我们将功能封装在一个按钮的点击事件中

#pragma mark - 相册操作

- (void)ClickShowPhotoAction:(id)sender{

   

   if([self isPhotoLibraryAvailable]){

    UIImagePickerController *controller = [[UIImagePickerController alloc]init];

     [controller setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];//设置类型

    NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];

     if ([selfcanUserPickPhotosFromPhotoLibrary]){

      [mediaTypes addObject:(NSString *)kUTTypeImage];

    }

     if ([selfcanUserPickVideosFromPhotoLibrary]){

      [mediaTypes addObject:(NSString *)kUTTypeMovie];

    }

     

    [controller setMediaTypes:mediaTypes];

    [controller setDelegate:self];// 设置代理

    [self.navigationControllerpresentModalViewController:controller animated:YES];

    [controller release];

    [mediaTypes release];

     

  }

}

2.关于UIImagePickerControllerDelegate协议,我们可以重用。

在这里,就不用赘述了!

最后,需要说的是,UIImagePickerControllerDelegate协议中

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info方法,中的info值,会根据我们操作的类型不同,而产生了不同的数据信息:

当操作的为图片时::

 

{

  UIImagePickerControllerCropRect = "NSRect: {

{0, 405}, {2448, 2449}}";

  UIImagePickerControllerEditedImage = "";

  UIImagePickerControllerMediaMetadata =   {

    DPIHeight = 72;

    DPIWidth = 72;

    Orientation = 6;

    "{Exif}" =     {

      ApertureValue = "2.526068811667588";

      BrightnessValue = "-0.0709875088566263";

      ColorSpace = 1;

      DateTimeDigitized = "2013:04:05 16:43:00";

      DateTimeOriginal = "2013:04:05 16:43:00";

      ExposureMode = 0;

      ExposureProgram = 2;

      ExposureTime = "0.05882352941176471";

      FNumber = "2.4";

      Flash = 24;

      FocalLenIn35mmFilm = 35;

      FocalLength = "4.28";

      ISOSpeedRatings =       (

        400

      );

      MeteringMode = 5;

      PixelXDimension = 3264;

      PixelYDimension = 2448;

      SceneType = 1;

      SensingMethod = 2;

      Sharpness = 0;

      ShutterSpeedValue = "4.099543917546131";

      SubjectArea =       (

        1631,

        1223,

        881,

        881

      );

      WhiteBalance = 0;

    };

    "{TIFF}" =     {

      DateTime = "2013:04:05 16:43:00";

      Make = Apple;

      Model = "iPhone 4S";

      Software = "5.1.1";

      XResolution = 72;

      YResolution = 72;

    };

  };

  UIImagePickerControllerMediaType = "public.image";

  UIImagePickerControllerOriginalImage = "";

}

当我们操作的为视频时:

{

  UIImagePickerControllerMediaType = "public.movie";

  UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/22A14825-DD7E-48E1-A1D5-2D85B82095B5/tmp/capture-T0x1363a0.tmp.etXfD4/capturedvideo.MOV";

}

希望对你有所帮助!

转载于:https://my.oschina.net/u/2524932/blog/533637

你可能感兴趣的文章
Structured Streaming Programming Guide
查看>>
Python之数据聚合与分组运算
查看>>
2015级C++第14周程序阅读 STL中的简单容器和迭代器
查看>>
ECS服务器集群
查看>>
android Handler机制之ThreadLocal详解
查看>>
netty tcp 字节有序->对象有序
查看>>
Factory模式与Prototype模式的异同
查看>>
解析LayoutSubviews
查看>>
[翻译] ASCScreenBrightnessDetector
查看>>
Android 自定义ProgressDialog
查看>>
向前插入迭代器
查看>>
将Button等控件嵌入到repeater中
查看>>
iOS开发CoreAnimation解读之四——Layer层动画内容
查看>>
数据仓库专题(2)-Kimball维度建模四步骤
查看>>
c++.net 托管类封装非托管类
查看>>
剑指offer系列之十:二进制中1的个数
查看>>
对技术的一点点看法
查看>>
用 Dagger 2 实现依赖注入
查看>>
浅析散列存储
查看>>
精读《Function VS Class 组件》
查看>>