前段时间对相册研究了一小下,今天闲着就总结总结 给自己加深下印象~
//创建照片选择器
UIImagePickerController *pickerVc = [[UIImagePickerController alloc]init];
//设置之前根据需要判断对应数据源是否支持 否则会崩溃
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
NSLog(@"支持相机");
//设置数据源
pickerVc.sourceType = UIImagePickerControllerSourceTypeCamera;
}
if([UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"支持相册列表");
//默认类型
pickerVc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
NSLog(@"支持相片库");
pickerVc.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
}
//设置代理
pickerVc.delegate = self;
//是否允许编辑图片
pickerVc.allowsEditing = YES;
//设置所支持的类型//kUTTypeImage(图片)/kUTTypeMovie(视频)这两个字符串常量定义在MobileCoreServices框架中。
//需导入头文件import <MobileCoreServices/MobileCoreServices.h>`
pickerVc.mediaTypes = @[(NSString *)kUTTypeImage];
//弹出视图
[self presentViewController:pickerVc animated:YES completion:nil];
<UIImagePickerControllerDelegate>代理方法
// 选中照片调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
NSLog(@"%@",info);
/* 此处info 有六个值
* UIImagePickerControllerMediaType; // 指定用户选择的媒体类型
* UIImagePickerControllerOriginalImage; // 原始图片
* UIImagePickerControllerEditedImage; // 裁剪后图片
* UIImagePickerControllerCropRect; // 剪裁尺寸
* UIImagePickerControllerMediaURL; // 媒体的url
* UIImagePickerControllerReferenceURL // 原件的url
* UIImagePickerControllerMediaMetadata // 数据源为照相机时 才有效
*/
// 获取媒体类型
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
// 判断获取类型:图片
if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){
UIImage *image;
if ([picker allowsEditing]){
//获取用户编辑之后的图像
image = [info objectForKey:UIImagePickerControllerEditedImage];
} else {
// 照片的原数据参数
image = [info objectForKey:UIImagePickerControllerOriginalImage];
}
}
**获取到的图片可以保存到沙盒也可以保存到相册保存的方法见文章最后**
注:使用ALAssetsLibrary需导入头文件
#import <AssetsLibrary/AssetsLibrary.h>
// 判断获取类型:视频
if ([mediaType isEqualToString:(NSString *)
//获取视频文件的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(@"Save success");
}else{
NSLog(@"error:%@", error);
}
}];
}
//注意:如果允许编辑且选中不进行dismiss 会卡死
[self dismissViewControllerAnimated:YES completion:nil];
}
//点击取消时调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissViewControllerAnimated:YES completion:nil];
}
----------
//1.保存到沙盒
NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
NSString * str = NSTemporaryDirectory();
NSString * path = [str stringByAppendingString:[NSString stringWithFormat:@"%@",@"imageName"]];
[imageData writeToFile:path atomically:YES];
//2.保存到手机相册
// 保存到手机相册
SEL selectorToCall = @selector(image:didFinishSavingWithError:contextInfo:);
UIImageWriteToSavedPhotosAlbum(image, self, selectorToCall, nil);
// 保存相册之后的回调方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error) {
NSLog(@"保存失败");
}else {
NSLog(@"保存成功");
}
}
关于UIImageJPEGRepresentation和UIImagePNGRepresentation的比较推荐地址http://blog.csdn.net/mideveloper/article/details/11473627
总结3点:
1.后者耗时相对较长,在相册选中照片时可能会出现卡顿
2.后者相对数据文件较大
3.如果图片清晰度要求不高UIImageJPEGRepresentation设置第二个参数可大幅度降低数据文件大小并且图片质量根据系数也不会很低
下面是一些干货
注:以下干货均为摘抄记录
// 前面的摄像头是否可用
- (BOOL) isFrontCameraAvailable{
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
}
// 后面的摄像头是否可用
- (BOOL) isRearCameraAvailable{
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
}
// 检查摄像头是否支持录像
- (BOOL) doesCameraSupportShootingVideos{
return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypeCamera];
}
// 检查摄像头是否支持拍照
- (BOOL) doesCameraSupportTakingPhotos{
return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera];
}
// 判断是否支持某种多媒体类型:拍照,视频
- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{
__block BOOL result = NO;
if ([paramMediaType length] == 0){
NSLog(@"Media type is empty.");
return NO;
}
NSArray *availableMediaTypes =[UIImagePickerController availableMediaTypesForSourceType:paramSourceType];
[availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {
NSString *mediaType = (NSString *)obj;
if ([mediaType isEqualToString:paramMediaType]){
result = YES;
*stop= YES;
}
}];
return result;
}
本来还想发表一下对相册多选照片的总结 不过写了这么多有点小累 ~
还是下篇补充吧��