iOS摄像头和相册-UIImagePickerController-浅析

本文详细介绍如何在iOS应用中使用UIImagePickerController类实现摄像头拍照、录像及从相册选取图片或视频的功能。包括检查硬件支持、配置UIImagePickerController、实现代理方法等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频。并且从相册中选取我们需要的图片或者视频。
关于iOS摄像头和相册的应用,可以使用 UIImagePickerController类来完成控制。
关于 UIImagePickerController的相关知识,
如下:

iOS的一些设备上都安装了摄像头。现在绝大多数都有了。
在编程中,我们是用相应的东西来进行照相,录像等功能。

一、UIImagePickerController

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


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

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

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


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

-(BOOL)isCameraAvailable{

   return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}


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

-(BOOL)isFrontCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];

}


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

-(BOOL)isRearCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];

}



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

-(BOOL)cameraSupportsMedia:(NSString *)paramMediaTypesourceType:(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 *)kUTTypeMoviesourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}


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

-(BOOL)canUserPickPhotosFromPhotoLibrary{

   return[selfcameraSupportsMedia:(NSString *)kUTTypeImagesourceType: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=[NSArrayarrayWithObjects: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 *)paramImagedidFinishSavingWithError:(NSError *)paramErrorcontextInfo:(void*)paramContextInfo{

    if (paramError == nil){

       NSLog(@"Image was savedsuccessfully.");

    } else {

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

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

    }

}


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

-(void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info{

   NSLog(@"Picker returnedsuccessfully.");

    NSLog(@"%@", info);

   NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

  // 判断获取类型:图片

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

      UIImage*theImage = nil;

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

      if ([pickerallowsEditing]){

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

          theImage = [infoobjectForKey:UIImagePickerControllerEditedImage];

       }else {

          //照片的元数据参数

          theImage = [infoobjectForKey:UIImagePickerControllerOriginalImage];

          

       }

       

       // 保存图片到相册中

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

      UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall,NULL);

       

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

       // 判断获取类型:视频

       //获取视频文件的url

       NSURL* mediaURL = [infoobjectForKey:UIImagePickerControllerMediaURL];

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

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

      ALAssetsLibrary *assetsLibrary =[[ALAssetsLibraryalloc] init];

       // 将视频保存到相册中

       [assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:mediaURL

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

                                      if (!error) {

                                         NSLog(@"captured video saved with noerror.");

                                       }else{

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

                                       }

                                    }];

       [assetsLibraryrelease];

    

    

    }

    

    

   [picker dismissModalViewControllerAnimated:YES];

}




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

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

    

   [picker dismissModalViewControllerAnimated:YES];

}

重要提示~~苦逼的程序员看到这是不是有点蛋疼,在您感觉蛋疼的时候请您点击一下这个链接,https://item.taobao.com/item.htm?id=528763456606  或扫描一下二维码来为您的小蛋蛋补充一下能量~~~
四、从相册获取图片和视频数据

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

#pragma mark - 相册操作


-(void)ClickShowPhotoAction:(id)sender{

    

   if([self isPhotoLibraryAvailable]){

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

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

      NSMutableArray *mediaTypes = [[NSMutableArrayalloc] init];

       if ([selfcanUserPickPhotosFromPhotoLibrary]){

          [mediaTypesaddObject:(NSString *)kUTTypeImage];

       }

       if ([selfcanUserPickVideosFromPhotoLibrary]){

          [mediaTypesaddObject:(NSString *)kUTTypeMovie];

       }

       

       [controllersetMediaTypes:mediaTypes];

       [controllersetDelegate:self];//设置代理

       [self.navigationControllerpresentModalViewController:controller animated:YES];

       [controllerrelease];

       [mediaTypesrelease];

       

    }



}


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

在这里,就不用赘述了!

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

-(void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(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";

}


希望对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值