一、UIImagePickerController的简单介绍
1.UIImagePickerController它可以用来拍照和录制视频,也可以用它进入相簿和照片库,主要是通过设定它的属性(sourceType)拾取源的类型
UIImagePickerControllerSourceTypePhotoLibrary:照片库,默认值
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
要用UIImagePickerController来拍照或者录制视频通常可以分为如下步骤:
- 创建UIImagePickerController对象。
- 指定拾取源,如果是拍照或者是录制的话需要指定为摄像头类型,平时选择照片时使用的拾取源是照片库或者相簿
- 指定摄像头,前置摄像头或者后置摄像头。
- 设置媒体类型mediaType,注意如果是录像必须设置,如果是拍照此步骤可以省略,因为mediaType默认包含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中)
- 指定捕获模式,拍照或者录制视频。(视频录制时必须先设置媒体类型再设置捕获模式)
- 展示UIImagePickerController(通常以模态窗口形式打开)。
- 拍照和录制视频结束后在代理方法中展示/保存照片或视频。
下面看一下常用的方法和属性
//属性: @property(nonatomic) UIImagePickerControllerSourceType sourceType //拾取源 @property(nonatomic,copy) NSArray *mediaTypes //媒体类型,默认情况下此数组包含kUTTypeImage,所以拍照时可以不用设置;但是当要录像的时候必须设置,可以设置为kUTTypeVideo(视 //频,但不带声音)或者kUTTypeMovie(视频并带有声音) @property(nonatomic) NSTimeInterval videoMaximumDuration // 视频最大录制时长,默认为10s @property(nonatomic) UIImagePickerControllerQualityType videoQuality //视频质量,枚举类型: UIImagePickerControllerQualityTypeHigh://高清质量 UIImagePickerControllerQualityTypeMedium://中等质量,适合WiFi传输 UIImagePickerControllerQualityTypeLow://低质量,适合蜂窝网传输 UIImagePickerControllerQualityType640x480:640*480 UIImagePickerControllerQualityTypeIFrame1280x720:1280*720 UIImagePickerControllerQualityTypeIFrame960x540:960*540 @property(nonatomic) BOOL showsCameraControls //是否显示摄像头控制面板,默认为YES @property(nonatomic,retain) UIView *cameraOverlayView //摄像头上覆盖的视图,可用通过这个视频来自定义拍照或录像界面 @property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode //摄像头捕获模式,捕获模式是枚举类型: UIImagePickerControllerCameraCaptureModePhoto://拍照模式 UIImagePickerControllerCameraCaptureModeVideo://视频录制模式 @property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice //摄像头设备,cameraDevice是枚举类型: UIImagePickerControllerCameraDeviceRear://前置摄像头 UIImagePickerControllerCameraDeviceFront://后置摄像头 @property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode //闪光灯模式,枚举类型: UIImagePickerControllerCameraFlashModeOff://关闭闪光灯 UIImagePickerControllerCameraFlashModeAuto://闪光灯自动 UIImagePickerControllerCameraFlashModeOn://打开闪光灯 //方法: + (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType //指定的源类型是否可用 + (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice // 指定的摄像头是否可用 + (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice //指定摄像头的闪光灯是否可用 + (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice //获得指定摄像头上的可用捕获模式 void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo) //保存照片到相簿 void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo) //保存视频到相簿 BOOL UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) //能否将视频保存到相簿 //协议方法: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info // 媒体拾取完成 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker // 取消拾取
使用UIImagePickerController要签订两个协议
#import "ViewController.h" #import <AVFoundation/AVFoundation.h> #import <MobileCoreServices/MobileCoreServices.h> @interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { int _isVideo; //是否录制视频,如果为1表示录制视频,0代表拍照 AVPlayer *_player;//播放器,用于录制完视频后播放视频 } @property (strong,nonatomic) UIImagePickerController *imagePicker; @property (weak, nonatomic) IBOutlet UIImageView *photo;//照片展示视 @end
主要代码实现如下
- (void)viewDidLoad { [super viewDidLoad]; //通过这里设置时拍照还是录制视频 _isVideo=YES; } #pragma mark --懒加载(加载UIImagePickerController的时候才初始化属性) -(UIImagePickerController *)imagePicker{ if (!_imagePicker) { _imagePicker=[[UIImagePickerController alloc]init]; _imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头 _imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头 if (_isVideo) { _imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie]; _imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720; _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频) }else{ _imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto; } _imagePicker.allowsEditing=YES;//允许编辑 _imagePicker.delegate=self;//设置代理,检测操作 } return _imagePicker; } #pragma mark - UIImagePickerController代理方法(点击保存调用方法) -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType]; if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照 UIImage *image; //如果允许编辑则获得编辑后的照片,否则获取原始照片 if (self.imagePicker.allowsEditing) { image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片 }else{ image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片 } [self.photo setImage:image];//显示照片 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);//保存到相簿 }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频 NSLog(@"video..."); NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径 NSString *urlStr=[url path]; if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) { //保存视频到相簿,注意也可以使用ALAssetsLibrary来保存 UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿 } } [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark --点击取消调用方法 -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ [self dismissViewControllerAnimated:YES completion:nil]; } //视频保存后的回调 - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ if (error) { NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription); }else{ NSLog(@"视频保存成功."); //录制完之后自动播放 NSURL *url=[NSURL fileURLWithPath:videoPath]; _player=[AVPlayer playerWithURL:url]; AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player]; playerLayer.frame=self.photo.frame; [self.photo.layer addSublayer:playerLayer]; [_player play]; } } #pragma mark - UI事件(点击拍照按钮) - (IBAction)takeClick:(UIButton *)sender { [self presentViewController:self.imagePicker animated:YES completion:nil]; }
这里我设置了拾取源是摄像头,模式是视频录制,拍照的功能也是一样的写法,只需要将_isVideo初始化的时候设置为NO就行了