iOS中读取照片库及保存图片或视频到照片库的要点解析

 更新时间:2016年06月07日 09:22:32   作者:刘伟  
iOS中保存到本地的图片视频都会被汇总到系统的PhotoLibrary中,这里我们就来看一下iOS中读取照片库及保存图片或视频到照片库的要点解析

读取照片库PhotoLibrary
iOS中如果我们只有一次读取一张图片或者一个视频(或拍一张照片/视频)的需求,那么我们用 UIImagePickerController 就可以搞定。但是很多时候我们需要一次性从PhotoLibrary读取多个照片或者视频,这时候我们就需要另辟蹊径了,好在apple为我们提供了相应的接口。
在开始coding之前我们想要认识几个类:
ALAssetsLibrary:代表整个PhotoLibrary,我们可以生成一个它的实例对象,这个实例对象就相当于是照片库的句柄。
ALAssetsGroup:照片库的分组,我们可以通过ALAssetsLibrary的实例获取所有的分组的句柄。
ALAsset:一个ALAsset的实例代表一个资产,也就是一个photo或者video,我们可以通过他的实例获取对应的subnail或者原图等等。
还需要了解的一个东东就是blocks,apple在iOS 4.0以后大量出现了这玩意儿,有使用越来越广的意思,不过这玩意儿确实好用。关于这玩意儿的内容我在这里不多讲,关注我的博客我会细讲。
对于本文的需求,我们读取group和每个asset都是异步的,但是我们现在用blocks我们可以在一个函数里面搞定。所以blocks确实很方便。
下面直接看代码吧:

复制代码 代码如下:

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];//生成整个photolibrary句柄的实例   
NSMutableArray *mediaArray = [[NSMutableArray alloc]init];//存放media的数组   
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {//获取所有group   
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {//从group里面   
            NSString* assetType = [result valueForProperty:ALAssetPropertyType];   
            if ([assetType isEqualToString:ALAssetTypePhoto]) {   
                NSLog(@"Photo");   
            }else if([assetType isEqualToString:ALAssetTypeVideo]){   
                NSLog(@"Video");   
            }else if([assetType isEqualToString:ALAssetTypeUnknown]){   
                NSLog(@"Unknow AssetType");   
            }   
               
            NSDictionary *assetUrls = [result valueForProperty:ALAssetPropertyURLs];   
            NSUInteger assetCounter = 0;   
            for (NSString *assetURLKey in assetUrls) {   
                NSLog(@"Asset URL %lu = %@",(unsigned long)assetCounter,[assetUrls objectForKey:assetURLKey]);   
            }   
               
            NSLog(@"Representation Size = %lld",[[result defaultRepresentation]size]);   
        }];   
    } failureBlock:^(NSError *error) {   
        NSLog(@"Enumerate the asset groups failed.");   
    }];  

保存图片或视频到PhotoLibrary
时文件然后,然后通过临时文件的路径去转存到photo library。
我们直接来看相应的API:

复制代码 代码如下:

// These methods can be used to add photos or videos to the saved photos album. 
 
// With a UIImage, the API user can use -[UIImage CGImage] to get a CGImageRef, and cast -[UIImage imageOrientation] to ALAssetOrientation. 
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock; 
 
// The API user will have to specify the orientation key in the metadata dictionary to preserve the orientation of the image 
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1); 
 
// If there is a conflict between the metadata in the image data and the metadata dictionary, the image data metadata values will be overwritten 
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1); 
 
- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock; 

前三个都是存图片的,通过参数我们可以发现,第一个使用了我们传进去的方向,第二个可以通过传入image的metadata保留image的metadata,前两个都是把图片转成 CGImageRef 再保存,第三个是传入NSData所以可以完整保留image的信息,同时也有metadata传进去,如果image自带的信息与metadata冲突那metadata会覆盖图片本身所带的metadata。
最后一个是存储视频的API,可以看到参数是一个NSURL,这个只要穿一个本地临时文件的file URL 就好了。
存储图片根据你的需求选择适当的API,比如我们获取到的是UIImage的实例,那么我们用第一个或者第二个比较方便,如果我们从本地临时文件读取image的数据那么我们直接用第三个就比较方便。
下面来一段简单的代码:
复制代码 代码如下:

- (void)saveImage:(UIImage*)image{ 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init]; 
    [assetsLibrary writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) { 
        if (error) { 
            NSLog(@"Save image fail:%@",error); 
        }else{ 
            NSLog(@"Save image succeed."); 
        } 
    }]; 


保存video就麻烦点了,你需要先把video写入本地文件然后,获取到本地临时文件的路径,然后调用上面的第四个API写入photo library。
关于写入临时文件,我之前写过一篇关于文件读写的文章,可以去看看。
我这里奉上一个把工程资源库的video写入photo library的demo,这样你就可以把video导入模拟器了,方便有些时候测试。
主要代码如下:
复制代码 代码如下:

- (void)save:(NSString*)urlString{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:urlString] 
                                completionBlock:^(NSURL *assetURL, NSError *error) { 
                                    if (error) { 
                                        NSLog(@"Save video fail:%@",error); 
                                    } else { 
                                        NSLog(@"Save video succeed."); 
                                    } 
                                }]; 

相关文章

  • iOS实现H5支付(微信、支付宝)原生封装

    iOS实现H5支付(微信、支付宝)原生封装

    这篇文章主要介绍了iOS实现H5支付(微信、支付宝)原生封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • iOS tableview实现顶部拉伸效果

    iOS tableview实现顶部拉伸效果

    这篇文章主要为大家详细介绍了iOS tableview实现顶部拉伸效果,以及头部拉伸效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 浅谈iOS应用中的相关正则及验证

    浅谈iOS应用中的相关正则及验证

    下面小编就为大家带来一篇浅谈iOS应用中的相关正则及验证。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • iOS开发中CAlayer层的属性以及自定义层的方法

    iOS开发中CAlayer层的属性以及自定义层的方法

    这篇文章主要介绍了iOS开发中CAlayer层的属性以及自定义层的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-11-11
  • iOS自定义UICollectionViewLayout实现瀑布流布局

    iOS自定义UICollectionViewLayout实现瀑布流布局

    这篇文章主要为大家详细介绍了iOS自定义UICollectionViewLayout实现瀑布流布局,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • IOS实现碎片化动画详解

    IOS实现碎片化动画详解

    在网上看到一个惊艳的碎片化动画,于是实现之后拿来讲解一下,有需要的小伙伴们可以参考学习哦。
    2016-08-08
  • iOS使用UICollectionView实现横向滚动照片效果

    iOS使用UICollectionView实现横向滚动照片效果

    这篇文章主要为大家详细介绍了iOS使用UICollectionView实现横向滚动照片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • IO实现计算器功能

    IO实现计算器功能

    这篇文章主要为大家详细介绍了IOS基础之计算器的编写,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • iOS WKWebView适配实战篇

    iOS WKWebView适配实战篇

    这篇文章主要介绍了iOS WKWebView适配实战篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • iOS开发xconfig和script脚本使用详解

    iOS开发xconfig和script脚本使用详解

    这篇文章主要为大家介绍了iOS开发xconfig和script脚本使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论