iOS中获取系统相册中的图片

作者: 船长_ | 来源:发表于2015-11-28 23:27 被阅读43892次

    一.获取单张图片

    思路:

    • 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片
    • 2.设置代理,遵守代理协议
    • 注意这个UIImagePickerController类比较特殊,需要遵守两个代理协议
    @interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
    
    • 3.实现代理的方法didFinishPickingMediaWithInfo
    - (void)getImageFromIpc
    {
        // 1.判断相册是否可以打开
        if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;
        // 2. 创建图片选择控制器
        UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
        /**
         typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
         UIImagePickerControllerSourceTypePhotoLibrary, // 相册
         UIImagePickerControllerSourceTypeCamera, // 用相机拍摄获取
         UIImagePickerControllerSourceTypeSavedPhotosAlbum // 相簿
         }
         */
        // 3. 设置打开照片相册类型(显示所有相簿)  
        ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        // ipc.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        // 照相机
        // ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
        // 4.设置代理
        ipc.delegate = self;
        // 5.modal出这个控制器
        [self presentViewController:ipc animated:YES completion:nil];
    }
    
    #pragma mark -- <UIImagePickerControllerDelegate>--
    // 获取图片后的操作
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
    {
        // 销毁控制器
        [picker dismissViewControllerAnimated:YES completion:nil];
    
        // 设置图片
        self.imageView.image = info[UIImagePickerControllerOriginalImage];
    }
    

    二.获取多张图片

    思路:

    • 导入头文件#import <Photos/Photos.h>
    • PHAsset : 一个资源, 比如一张图片\一段视频
    • PHAssetCollection : 一个相簿
    • PHImageManager 图片管理者,是单例,发送请求才能从asset获取图片
    • PHImageRequestOptions图片请求选项
    • 注意:这个类是iOS8开始推广,iOS9开始废弃之前的方法
      系统适配iOS8之前,用下面这个库里面的API
    #import <AssetsLibrary/AssetsLibrary.h>
    

    1.获得所有相簿的原图

    - (void)getOriginalImages
    {
        // 获得所有的自定义相簿
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        // 遍历所有的自定义相簿
        for (PHAssetCollection *assetCollection in assetCollections) {
            [self enumerateAssetsInAssetCollection:assetCollection original:YES];
        }
        
        // 获得相机胶卷
        PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
        // 遍历相机胶卷,获取大图
        [self enumerateAssetsInAssetCollection:cameraRoll original:YES];
    }
    

    2.获得所有相簿中的缩略图

    - (void)getThumbnailImages
    {
        // 获得所有的自定义相簿
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        // 遍历所有的自定义相簿
        for (PHAssetCollection *assetCollection in assetCollections) {
            [self enumerateAssetsInAssetCollection:assetCollection original:NO];
        }
        // 获得相机胶卷
        PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
        [self enumerateAssetsInAssetCollection:cameraRoll original:NO];
    }
    

    3.遍历相册

    /**
     *  遍历相簿中的所有图片
     *  @param assetCollection 相簿
     *  @param original        是否要原图
     */
    - (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original
    {
        NSLog(@"相簿名:%@", assetCollection.localizedTitle);
        
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        // 同步获得图片, 只会返回1张图片
        options.synchronous = YES;
    
        // 获得某个相簿中的所有PHAsset对象
        PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
        for (PHAsset *asset in assets) {
            // 是否要原图
            CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
            
            // 从asset中获得图片
            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
                NSLog(@"%@", result);
            }];
        }
    }
    

    相关文章

      网友评论

      • 心语风尚:[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

        }];

        把这个方法放到 循环中 遍历 UIimage 添加到数组 作为数据源 这种方法现实吗
      • Mr_Zander:CGSizeZero获取不到图片吧?
      • 拉风的胖鱼:如果拿的是全图,如何展示?
      • 原来你是这种花椒: [self enumerateAssetsInAssetCollection:assetCollection original:YES]; 报错是为啥啊?
      • linzaifei:楼主为什么我获取的原图都是nil 传的是CGSizeMake(asset.pixelWidth, asset.pixelHeight)
        7a45b5f6be54:都是readOnly ,你怎么点出来的 asset.pixelHeight、asset.pixelWidth
      • kkkore:怎么设置不获取全景图呢?
      • JohnQ:博主 问一个弱弱的问题 我用可变数组记住了result 这个时候我collection reload后没有刷新进行赋值
      • 无神: [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        获取到的图片模糊,求解?
        d7261c547c6c:@无神 我当时是这个size的问题,解决了就好了。
        无神:@胖成桩桩 昨天已经解决了,不是目标size的问题,是分辨率的问题!
        d7261c547c6c:这个地方主要是你请求的图片没有给size或者是默认的size,比如你用集合视图去请求,就用cell的size去请求照片,这样的图片就不会模糊了
      • Ashoka_APP:真机测试的时候 崩溃在了往数组添加图片的地方 这儿我很纳闷
        SunshineTeemo:@胖成桩桩 我的也是,请求原图,对的话会崩,请求缩略图,也很慢
        d7261c547c6c:楼主,麻烦问一下,这种方法在请求的时候速度会比较慢一点吗。在请求的时候总是会有一段时间的空白期
        ayoueirep:解决了吗
      • Link913:楼主一般这两个就够了对吗 // 获得所有的自定义相簿
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        // 遍历所有的自定义相簿
        for (PHAssetCollection *assetCollection in assetCollections) {
        [self enumerateAssetsInAssetCollection:assetCollection original:YES];
        }
      • hhuua:楼主你好,在获取缩略图时有没有提升效率的方法。我想做一个图片选择器,获取的图片的尺寸设置为cell的宽度的1.5倍。尺寸不大,再小就糊了。但是获取过程中大概需要4,5秒钟,但QQ的图片选择器大概只需要1秒钟。
        N_S_L_O_G_Z_G_L:@悦享生活 很对
        c051e9a29abc:@sunshineWarmYou 当你获得某个相簿中的所有PHAsset对象(assets)不要直接转成UIImage对象(这个应该是造成读取速度慢的一个原因),可以把assets当成ColletionView的数据源,然后在配置cel时再把PHAsset转UIImage给cell赋值
        SunshineTeemo:我的也是读取很慢
      • LifeYet:楼主 为何蹦了?不是内存问题,断点也没有停下,求指教
        AllenZYQ:@LifeYet 看下打印信息? 是不是iOS10 蹦的。
      • 路在脚下了:您好,我想问下,我从相册选择视频,回调获得PHAsset,要做视频上传,该怎么处理PHAsset啊?求帮助
      • NHW:楼主,我获取相册时候的,手动改变隐私中的是否允许获取图片,就会崩溃,
        还有就是第一次我进来只获取相册点击允许的时候,是读取不到的
        5986b49f827c:在app运行时更改相册权限的话是会强制刷新应用的
      • 634585edc862:楼主知道怎么得到图片的路径吗
        来宝:@sunWarm 我获取路径的方式info[@"PHImageFileURLKey"],有的图片返回路径,有的不返回路径就崩了
        来宝:@子瓜虫 大神获取路径成功了吗?
        ce410d00e4b7:@子瓜虫 那个返回的字典里面有路径的
      • 还有什么没有注册的:标识一下,正好有需求。
      • SwiftAI:获取到模拟器内的图片,然后设置给self.imageview之后, 要怎么才能获取这张图片的名字,或者获取它的路径?
        SwiftAI:@来宝 印象中是有一个代理方法, 可以打印出相片的信息, 具体的忘了
        SwiftAI:@来宝 记得当时已解决
        来宝:@hpuhjl 大神获取路径成功了吗?

      本文标题:iOS中获取系统相册中的图片

      本文链接:https://www.haomeiwen.com/subject/zmgdhttx.html