本文转载自:http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html
在原文的基础上,增加了存储图片到app和从app存储中读取图片。
摘要:
在一些应用中,我们需要用到iOS设备的摄像头进行拍照,视频。并且从相册中选取我们需要的图片或者视频。关于iOS摄像头和相册的应用,可以使用UIImagePickerController类来完成控制。
关于UIImagePickerController的相关知识,如下:
iOS的一些设备上都安装了摄像头。现在绝大多数都有了。在编程中,我们是用相应的东西来进行照相,录像等功能。
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 *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary]; } // 是否可以在相册中选择视频 - (BOOL) canUserPickPhotosFromPhotoLibrary{ return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary]; }
我们将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."); } }
具体解释一下:
通过设置setSourceType方法可以确定调用出来的UIImagePickerController所显示出来的界面
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) { UIImagePickerControllerSourceTypePhotoLibrary, UIImagePickerControllerSourceTypeCamera, UIImagePickerControllerSourceTypeSavedPhotosAlbum };
// 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以 NSString *requiredMediaType = ( NSString *)kUTTypeImage; NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie; NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil]; [controller setMediaTypes:arrMediaTypes];
我们要对我们拍摄的照片和视频进行存储,那么就要实现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 alloc] 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]; }
#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]; } }
我们可以重用,在这里,就不用赘述了!
最后,需要说的是,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"; }
NSString *imagePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"]; [UIImagePNGRepresentation(pickedImage) writeToFile:imagePath atomically:YES];
NSString *imagePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"image.png"]; UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath]; if (image) { self.imageView.image = image; }
转载请注明出处,谢谢