有关iOS相册的调用

前段时间对相册研究了一小下,今天闲着就总结总结 给自己加深下印象~

//创建照片选择器
    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;
}

本来还想发表一下对相册多选照片的总结 不过写了这么多有点小累 ~
还是下篇补充吧��

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值