在一些应用中,我们需要用到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 [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 = [infoobjectForKey:UIImagePickerControllerMediaType];

// 判断获取类型:图片

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

UIImage *theImage = nil;

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

if ([picker allowsEditing]){

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

theImage = [infoobjectForKey:UIImagePickerControllerEditedImage];

} else {

// 照片的元数据参数

theImage = [infoobjectForKey:UIImagePickerControllerOriginalImage];

}

// 保存图片到相册中

SEL selectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);

UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall, NULL);

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

// 判断获取类型:视频

//获取视频文件的url

NSURL* mediaURL = [infoobjectForKey:UIImagePickerControllerMediaURL];

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

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

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibraryalloc] init];

// 将视频保存到相册中

[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 alloc] init];

if ([self canUserPickPhotosFromPhotoLibrary]){

[mediaTypes addObject:( NSString *)kUTTypeImage];

}

if ([self canUserPickVideosFromPhotoLibrary]){

[mediaTypes addObject:( NSString *)kUTTypeMovie];

}

[controller setMediaTypes:mediaTypes];

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

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

}

 
 
选择资源以后获取资源路径:

- (void) pickImage: (id) sender

{

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

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){

ipc.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;

ipc.mediaTypes =[UIImagePickerController availableMediaTypesForSourceType:ipc.sourceType];

}

ipc.delegate = self;

ipc.allowsImageEditing = NO;

[self presentModalViewController:ipc animated:YES];

}

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

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

if ([mediaType isEqualToString:@"public.image"]){

//UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];

UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

NSLog(@"found an image");

[UIImageJPEGRepresentation(image, 1.0f) writeToFile:[self findUniqueSavePath] atomically:YES];

SETIMAGE(image);

CFShow([[NSFileManager defaultManager] directoryContentsAtPath:[NSHomeDirectory() stringByAppendingString:@"/Documents"]]);

}

else if ([mediaType isEqualToString:@"public.movie"]){

NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

NSLog(@"found a video");

NSData *webData = [NSData dataWithContentsOfURL:videoURL];

//NSData *video = [[NSString alloc] initWithContentsOfURL:videoURL];

[webData writeToFile:[self findUniqueMoviePath] atomically:YES];

CFShow([[NSFileManager defaultManager] directoryContentsAtPath:[NSHomeDirectory() stringByAppendingString:@"/Documents"]]);

//NSLog(videoURL);

}

[picker dismissModalViewControllerAnimated:YES];

}

摘自:http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html  感谢博主分享

iOS摄像头和相册-UIImagePickerController常用操作的更多相关文章

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

    转载自:http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html 在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频.并且从相册中选取我们需要的 ...

  2. iOS摄像头和相册-UIImagePickerController-浅析(转)

    iOS摄像头和相册-UIImagePickerController-浅析(转) 转自: http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html 在一些 ...

  3. iOS摄像头和相册(转)

    iOS摄像头和相册iOS 获取图片有三种方法1. 直接调用摄像头拍照 2. 从相册中选择 3. 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口: 用 ...

  4. iOS网络-05-AFNetwoking原理及常用操作

    AFN的六大模块 NSURLConnection,主要对NSURLConnection进行了进一步的封装,包含以下核心的类: AFURLConnectionOperation AFHTTPReques ...

  5. iOS8.0 使用Photos.framework对相册的常用操作

    转载自:http://blog.csdn.net/longitachi/article/details/50130957 1.判断相册访问权限 首先我们访问相册,肯定有需要判断是否有访问权限的时候,然 ...

  6. ios获取摄像头与相册图片

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

  7. iOS系统相册的有关操作

    iOS中,我们选择相册中的资源和调用摄像头可以使用 :UIImagePickerController类来完成,不使用UI我们可以通过:ALAssetsLibrary类来使用相册资源. 一. ALAss ...

  8. iOS开发:UINavigationController常用操作

    NavigationController常用操作: 更改bar的背景颜色:self.navigationController?.navigationBar.barTintColor =UIColor. ...

  9. ios中从相册:相机中获取图片信息

    ios中从相册/相机中获取图片信息 从相册中获取图片的信息 UIImagePickerController *imgPickView = [[UIImagePickerController alloc ...

随机推荐

  1. Codeforces 611C New Year and Domino(二维前缀和)

    题目大概说给一个n*m个格子,格子'.'表示可以放东西,多次询问矩形区域(x1,y1)-(x2,y2)有几种放一张1*2的骨牌的方案数. 分别考虑横着竖着放,预处理出二维的前缀和,即sum[x][y] ...

  2. ccc 播放动画

    cc.Class({ extends: cc.Component, properties: { anim:cc.Animation, }, // use this for initialization ...

  3. (转)Storm UI 解释

    Storm UI link:http://lbxc.iteye.com/category/221265 本文主要解释下storm ui上各项属性的含义. 1. mainpage 首页主要分为3块: a ...

  4. 经验分享:多屏复杂动画CSS技巧三则

    当下CSS3应用已经相当广泛,其中重要成员之一就是CSS3动画.并且,随着CSS动画的逐渐深入与普及,更复杂与细腻的动画场景也如雨后春笋般破土而出.例如上个月做的「企业QQ-新年祝福」活动: 感谢sh ...

  5. NHibernate one-to-one

    NHibernate里面one-to-one有两种方式:主键关联和唯一外健关联 主键关联: 两个表拥有相同的主键字段,值相同的关联在一起.典型的应用是一个对象的属性太多,将常用的属性跟不常用的附加属性 ...

  6. winform中键盘和鼠标事件的捕捉和重写(转)

    在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...

  7. 【软件工程实践一】git使用心得

    第一次软工实践,我们需要做的是学习如何使用github,并将本地库的文件添加到远程库中,以下是我进行实践的工程. [一.git的安装及准备工作] 首先从http://msysgit.github.io ...

  8. 兼容性好的CSS字体投影

    <p>兼容性良好的css文字描边</p> <style><!-- h1, p { color: #fff; width: 100%; text-align: ...

  9. Android studio使用增量更新进行版本升级

    今天将Android Studio更新了一下,特此记录一下升级过程,以后可能还会用得着. 首先通过菜单栏进入 Help --> Check for update 查看下当前版本是否需要更新.事实 ...

  10. [LintCode] LRU Cache 缓存器

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...