kidd风的IOS日志之摄像头以及相册的调用

本文介绍如何使用 UIImagePickerController 在 iOS 应用中实现拍照和录制视频功能。详细讲解了 UIImagePickerController 的常用属性和方法,包括如何设置摄像头、指定媒体类型、调整视频质量和时长等。

UIImagePickerController拍照和视频录制

下面看一下在iOS如何拍照和录制视频。在iOS中要拍照和录制视频最简单的方法就是使用UIImagePickerController。UIImagePickerController继承于UINavigationController,前面的文章中主要使用它来选取照片,其实UIImagePickerController的功能不仅如此,它还可以用来拍照和录制视频。首先看一下这个类常用的属性和方法:




属性 说明
@property(nonatomic)           UIImagePickerControllerSourceType     sourceType 拾取源类型,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
,默认值
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
@property(nonatomic,copy)      NSArray                              *mediaTypes 媒体类型,默认情况下此数组包含kUTTypeImage,所以拍照时可以不用设置;但是当要录像的时候必须设置,可以设置为kUTTypeVideo(视频,但不带声音)或者kUTTypeMovie(视频并带有声音)
@property(nonatomic)           NSTimeInterval                        videoMaximumDuration 视频最大录制时长,默认为10 s
@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)           CGAffineTransform                     cameraViewTransform 摄像头形变
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode 摄像头捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式
@property(nonatomic) UIImagePickerControllerCameraDevice      cameraDevice 摄像头设备,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头
@property(nonatomic) UIImagePickerControllerCameraFlashMode   cameraFlashMode 闪光灯模式,枚举类型:
UIImagePickerControllerCameraFlashModeOff:关闭闪光灯
UIImagePickerControllerCameraFlashModeAuto:闪光灯自动
UIImagePickerControllerCameraFlashModeOn:打开闪光灯
类方法 说明
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType 指定的源类型是否可用,sourceType是枚举类型:
UIImagePickerControllerSourceTypePhotoLibrary:照片库
UIImagePickerControllerSourceTypeCamera:摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿
+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType 指定的源设备上可用的媒体类型,一般就是图片和视频
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice 指定的摄像头是否可用,cameraDevice是枚举类型:
UIImagePickerControllerCameraDeviceRear:前置摄像头
UIImagePickerControllerCameraDeviceFront:后置摄像头
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice 指定摄像头的闪光灯是否可用
+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice 获得指定摄像头上的可用捕获模式,捕获模式是枚举类型:
UIImagePickerControllerCameraCaptureModePhoto:拍照模式
UIImagePickerControllerCameraCaptureModeVideo:视频录制模式
对象方法 说明
- (void)takePicture 编程方式拍照
- (BOOL)startVideoCapture 编程方式录制视频
- (void)stopVideoCapture 编程方式停止录制视频
代理方法 说明
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 媒体拾取完成
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 取消拾取
扩展方法(主要用于保存照片、视频到相簿) 说明
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo) 保存照片到相簿
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) 能否将视频保存到相簿
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo) 保存视频到相簿

要用UIImagePickerController来拍照或者录制视频通常可以分为如下步骤:

  1. 创建UIImagePickerController对象。
  2. 指定拾取源,平时选择照片时使用的拾取源是照片库或者相簿,此刻需要指定为摄像头类型。
  3. 指定摄像头,前置摄像头或者后置摄像头。
  4. 设置媒体类型mediaType,注意如果是录像必须设置,如果是拍照此步骤可以省略,因为mediaType默认包含kUTTypeImage(注意媒体类型定义在MobileCoreServices.framework中)
  5. 指定捕获模式,拍照或者录制视频。(视频录制时必须先设置媒体类型再设置捕获模式
  6. 展示UIImagePickerController(通常以模态窗口形式打开)。
  7. 拍照和录制视频结束后在代理方法中展示/保存照片或视频。

当然这个过程中有很多细节可以设置,例如是否显示拍照控制面板,拍照后是否允许编辑等等,通过上面的属性/方法列表相信并不难理解。下面就以一个示例展示如何使用UIImagePickerController来拍照和录制视频,下面的程序中只要将_isVideo设置为YES就是视频录制模式,录制完后在主视图控制器中自动播放;如果将_isVideo设置为NO则为拍照模式,拍照完成之后在主视图控制器中显示拍摄的照片:


#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 [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];

}


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

- (BOOL) canUserPickVideosFromPhotoLibrary{

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

}


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

- (BOOL) canUserPickPhotosFromPhotoLibrary{

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

}


摄像头进行拍照和录像功能

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

 

#pragma mark - 拍照按钮事件


- (void)ClickControlAction:(id)sender{

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

    if ([self isCameraAvailable] && [self doesCameraSupportTakingPhotos]){

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

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

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


        

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

        NSString *requiredMediaType = ( NSString *)kUTTypeImage;

        NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;

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

        [controller setMediaTypes:arrMediaTypes];

        

        // 设置录制视频的质量

        [controller setVideoQuality:UIImagePickerControllerQualityTypeHigh];

        //设置最长摄像时间

        [controller setVideoMaximumDuration:10.f];

        


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

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

        [self.navigationController presentModalViewController: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 ([picker allowsEditing]){

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

            theImage = [info objectForKey:UIImagePickerControllerEditedImage];

        } else {

            // 照片的元数据参数

            theImage = [info objectForKey:UIImagePickerControllerOriginalImage];

            

        }

        

        // 保存图片到相册中

        SEL selectorToCall = @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 allocinit];

        // 将视频保存到相册中

        [assetsLibrary writeVideoAtPathToSavedPhotosAlbum: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 allocinit];

        if ([self canUserPickPhotosFromPhotoLibrary]){

            [mediaTypes addObject:( NSString *)kUTTypeImage];

        }

        if ([self canUserPickVideosFromPhotoLibrary]){

            [mediaTypes addObject:( NSString *)kUTTypeMovie];

        }

        

        [controller setMediaTypes:mediaTypes];

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

        [self.navigationController presentModalViewController:controlleranimated: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";

}


希望对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值