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啊?求帮助
  • 30a47084980f:楼主,我获取相册时候的,手动改变隐私中的是否允许获取图片,就会崩溃,
    还有就是第一次我进来只获取相册点击允许的时候,是读取不到的
    5986b49f827c:在app运行时更改相册权限的话是会强制刷新应用的
  • 634585edc862:楼主知道怎么得到图片的路径吗
    来宝:@sunWarm 我获取路径的方式info[@"PHImageFileURLKey"],有的图片返回路径,有的不返回路径就崩了
    来宝:@子瓜虫 大神获取路径成功了吗?
    ce410d00e4b7:@子瓜虫 那个返回的字典里面有路径的
  • 还有什么没有注册的:标识一下,正好有需求。
  • SwiftAI:获取到模拟器内的图片,然后设置给self.imageview之后, 要怎么才能获取这张图片的名字,或者获取它的路径?
    SwiftAI:@来宝 印象中是有一个代理方法, 可以打印出相片的信息, 具体的忘了
    SwiftAI:@来宝 记得当时已解决
    来宝:@hpuhjl 大神获取路径成功了吗?

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

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