iOS 调用相机和相册详解

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

关于UIImagePickerController的相关知识,如下:

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


一、UIImagePickerController类

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


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

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

[objc]  view plain  copy
  1. #pragma mark - 摄像头和相册相关的公共类  
  2.   
  3. // 判断设备是否有摄像头  
  4. - (BOOL) isCameraAvailable{  
  5.     return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];  
  6. }  
  7.   
  8. // 前面的摄像头是否可用  
  9. - (BOOL) isFrontCameraAvailable{  
  10.     return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];  
  11. }  
  12.   
  13. // 后面的摄像头是否可用  
  14. - (BOOL) isRearCameraAvailable{  
  15.     return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];  
  16. }  
  17.   
  18.   
  19. // 判断是否支持某种多媒体类型:拍照,视频  
  20. - (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{  
  21.     __block BOOL result = NO;  
  22.     if ([paramMediaType length] == 0){  
  23.         NSLog(@"Media type is empty.");  
  24.         return NO;  
  25.     }  
  26.     NSArray *availableMediaTypes =[UIImagePickerControlleravailableMediaTypesForSourceType:paramSourceType];  
  27.     [availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {  
  28.                                                         NSString *mediaType = (NSString *)obj;  
  29.                                                         if ([mediaTypeisEqualToString:paramMediaType]){  
  30.                                                             result = YES;  
  31.                                                             *stop= YES;  
  32.                                                         }  
  33.           
  34.     }];  
  35.     return result;  
  36. }  
  37.   
  38. // 检查摄像头是否支持录像  
  39. - (BOOL) doesCameraSupportShootingVideos{  
  40.     return [self cameraSupportsMedia:( NSString *)kUTTypeMoviesourceType:UIImagePickerControllerSourceTypeCamera];  
  41. }  
  42.   
  43. // 检查摄像头是否支持拍照  
  44. - (BOOL) doesCameraSupportTakingPhotos{  
  45.     return [self cameraSupportsMedia:( NSString *)kUTTypeImagesourceType:UIImagePickerControllerSourceTypeCamera];  
  46. }  
  47.   
  48. #pragma mark - 相册文件选取相关  
  49. // 相册是否可用  
  50. - (BOOL) isPhotoLibraryAvailable{  
  51.     return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];  
  52. }  
  53.   
  54. // 是否可以在相册中选择视频  
  55. - (BOOL) canUserPickVideosFromPhotoLibrary{  
  56.     return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];  
  57. }  
  58.   
  59. // 是否可以在相册中选择视频  
  60. - (BOOL) canUserPickPhotosFromPhotoLibrary{  
  61.     return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];  
  62. }  


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

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

[objc]  view plain  copy
  1. #pragma mark - 拍照按钮事件  
  2.   
  3. - (void)ClickControlAction:(id)sender{  
  4.     // 判断有摄像头,并且支持拍照功能  
  5.     if ([self isCameraAvailable] && [self doesCameraSupportTakingPhotos]){  
  6.         // 初始化图片选择控制器  
  7.         UIImagePickerController *controller = [[UIImagePickerController alloc] init];  
  8.         [controller setSourceType:UIImagePickerControllerSourceTypeCamera];// 设置类型  
  9.   
  10.           
  11.         // 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以  
  12.         NSString *requiredMediaType = ( NSString *)kUTTypeImage;  
  13.         NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;  
  14.         NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];  
  15.         [controller setMediaTypes:arrMediaTypes];  
  16.           
  17.         // 设置录制视频的质量  
  18.         [controller setVideoQuality:UIImagePickerControllerQualityTypeHigh];  
  19.         //设置最长摄像时间  
  20.         [controller setVideoMaximumDuration:10.f];  
  21.           
  22.   
  23.         [controller setAllowsEditing:YES];// 设置是否可以管理已经存在的图片或者视频  
  24.         [controller setDelegate:self];// 设置代理  
  25.         [self.navigationController presentModalViewController:controller animated:YES];  
  26.         [controller release];  
  27.     } else {  
  28.         NSLog(@"Camera is not available.");  
  29.     }  
  30. }  


具体解释一下:

1、setSourceType方法

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

[objc]  view plain  copy
  1. typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {  
  2.     UIImagePickerControllerSourceTypePhotoLibrary,  
  3.     UIImagePickerControllerSourceTypeCamera,  
  4.     UIImagePickerControllerSourceTypeSavedPhotosAlbum  
  5. };  

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


2、setMediaTypes方法

[objc]  view plain  copy
  1. // 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以  
  2.         NSString *requiredMediaType = ( NSString *)kUTTypeImage;  
  3.         NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;  
  4.         NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];  
  5.         [controller setMediaTypes:arrMediaTypes];  



3、关于UIImagePickerControllerDelegate协议

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

[objc]  view plain  copy
  1. #pragma mark - UIImagePickerControllerDelegate 代理方法  
  2.   
  3.   
  4. // 保存图片后到相册后,调用的相关方法,查看是否保存成功  
  5. - (void) imageWasSavedSuccessfully:(UIImage *)paramImage didFinishSavingWithError:(NSError *)paramError contextInfo:(voidvoid *)paramContextInfo{  
  6.     if (paramError == nil){  
  7.         NSLog(@"Image was saved successfully.");  
  8.     } else {  
  9.         NSLog(@"An error happened while saving the image.");  
  10.         NSLog(@"Error = %@", paramError);  
  11.     }  
  12. }  
  13.   
  14. // 当得到照片或者视频后,调用该方法  
  15. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{  
  16.     NSLog(@"Picker returned successfully.");  
  17.     NSLog(@"%@", info);  
  18.     NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];  
  19.     // 判断获取类型:图片  
  20.     if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){  
  21.         UIImage *theImage = nil;  
  22.         // 判断,图片是否允许修改  
  23.         if ([picker allowsEditing]){  
  24.             //获取用户编辑之后的图像  
  25.             theImage = [info objectForKey:UIImagePickerControllerEditedImage];  
  26.         } else {  
  27.             // 照片的元数据参数  
  28.             theImage = [info objectForKey:UIImagePickerControllerOriginalImage];  
  29.               
  30.         }  
  31.           
  32.         // 保存图片到相册中  
  33.         SEL selectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);  
  34.         UIImageWriteToSavedPhotosAlbum(theImage, self,selectorToCall, NULL);  
  35.           
  36.     }else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){  
  37.         // 判断获取类型:视频  
  38.         //获取视频文件的url  
  39.         NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];  
  40.         //创建ALAssetsLibrary对象并将视频保存到媒体库  
  41.         // Assets Library 框架包是提供了在应用程序中操作图片和视频的相关功能。相当于一个桥梁,链接了应用程序和多媒体文件。  
  42.         ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];  
  43.         // 将视频保存到相册中  
  44.         [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaURL  
  45.                                           completionBlock:^(NSURL *assetURL, NSError *error) {  
  46.                                               if (!error) {  
  47.                                                   NSLog(@"captured video saved with no error.");  
  48.                                               }else{  
  49.                                                   NSLog(@"error occured while saving the video:%@", error);  
  50.                                               }  
  51.                                           }];  
  52.         [assetsLibrary release];  
  53.       
  54.       
  55.     }  
  56.       
  57.       
  58.     [picker dismissModalViewControllerAnimated:YES];  
  59. }  
  60.   
  61.   
  62. // 当用户取消时,调用该方法  
  63. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{  
  64.       
  65.     [picker dismissModalViewControllerAnimated:YES];  
  66. }  


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

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

[objc]  view plain  copy
  1. #pragma mark - 相册操作  
  2.   
  3. - (void)ClickShowPhotoAction:(id)sender{  
  4.       
  5.     if ([self isPhotoLibraryAvailable]){  
  6.         UIImagePickerController *controller = [[UIImagePickerController alloc] init];  
  7.          [controller setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];// 设置类型  
  8.         NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];  
  9.         if ([self canUserPickPhotosFromPhotoLibrary]){  
  10.             [mediaTypes addObject:( NSString *)kUTTypeImage];  
  11.         }  
  12.         if ([self canUserPickVideosFromPhotoLibrary]){  
  13.             [mediaTypes addObject:( NSString *)kUTTypeMovie];  
  14.         }  
  15.           
  16.         [controller setMediaTypes:mediaTypes];  
  17.         [controller setDelegate:self];// 设置代理  
  18.         [self.navigationController presentModalViewController:controller animated:YES];  
  19.         [controller release];  
  20.         [mediaTypes release];  
  21.           
  22.     }  
  23. }  


2、关于UIImagePickerControllerDelegate协议

我们可以重用,在这里,就不用赘述了!



五、info信息

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

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

不同的数据信息

1、当操作的为图片时

[objc]  view plain  copy
  1. {  
  2.     UIImagePickerControllerCropRect = "NSRect: {{0, 405}, {2448, 2449}}";  
  3.     UIImagePickerControllerEditedImage = "";  
  4.     UIImagePickerControllerMediaMetadata =     {  
  5.         DPIHeight = 72;  
  6.         DPIWidth = 72;  
  7.         Orientation = 6;  
  8.         "{Exif}" =         {  
  9.             ApertureValue = "2.526068811667588";  
  10.             BrightnessValue = "-0.0709875088566263";  
  11.             ColorSpace = 1;  
  12.             DateTimeDigitized = "2013:04:05 16:43:00";  
  13.             DateTimeOriginal = "2013:04:05 16:43:00";  
  14.             ExposureMode = 0;  
  15.             ExposureProgram = 2;  
  16.             ExposureTime = "0.05882352941176471";  
  17.             FNumber = "2.4";  
  18.             Flash = 24;  
  19.             FocalLenIn35mmFilm = 35;  
  20.             FocalLength = "4.28";  
  21.             ISOSpeedRatings =             (  
  22.                 400  
  23.             );  
  24.             MeteringMode = 5;  
  25.             PixelXDimension = 3264;  
  26.             PixelYDimension = 2448;  
  27.             SceneType = 1;  
  28.             SensingMethod = 2;  
  29.             Sharpness = 0;  
  30.             ShutterSpeedValue = "4.099543917546131";  
  31.             SubjectArea =             (  
  32.                 1631,  
  33.                 1223,  
  34.                 881,  
  35.                 881  
  36.             );  
  37.             WhiteBalance = 0;  
  38.         };  
  39.         "{TIFF}" =         {  
  40.             DateTime = "2013:04:05 16:43:00";  
  41.             Make = Apple;  
  42.             Model = "iPhone 4S";  
  43.             Software = "5.1.1";  
  44.             XResolution = 72;  
  45.             YResolution = 72;  
  46.         };  
  47.     };  
  48.     UIImagePickerControllerMediaType = "public.image";  
  49.     UIImagePickerControllerOriginalImage = "";  
  50. }  


2、当我们操作的为视频时

[objc]  view plain  copy
  1. {  
  2.     UIImagePickerControllerMediaType = "public.movie";  
  3.     UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/22A14825-DD7E-48E1-A1D5-2D85B82095B5/tmp/capture-T0x1363a0.tmp.etXfD4/capturedvideo.MOV";  
  4. }  



六、存储图片到app中和从app中读取图片

1、把选择的图片存储到app中

[objc]  view plain  copy
  1. NSString *imagePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"];  
  2. [UIImagePNGRepresentation(pickedImage) writeToFile:imagePath atomically:YES];  


2、从app中读取存储的图片

[objc]  view plain  copy
  1. NSString *imagePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"];  
  2. UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];  
  3. if (image) {  
  4.     self.imageView.image = image;  
  5. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值