iOS 保存图片或视频到PhotoLibrary

2019-04-15 14:39发布

存储图片到photo library与存储video到photo library的API差不多,但也有所不同。图片是可以直接把数据写入photo library,而video需要先把数据存到临时文件然后,然后通过临时文件的路径去转存到photo library。 我们直接来看相应的API: [java] view plaincopyprint?
  1. // These methods can be used to add photos or videos to the saved photos album.  
  2.   
  3. // With a UIImage, the API user can use -[UIImage CGImage] to get a CGImageRef, and cast -[UIImage imageOrientation] to ALAssetOrientation.  
  4. - (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;  
  5.   
  6. // The API user will have to specify the orientation key in the metadata dictionary to preserve the orientation of the image  
  7. - (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);  
  8.   
  9. // If there is a conflict between the metadata in the image data and the metadata dictionary, the image data metadata values will be overwritten  
  10. - (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1);  
  11.   
  12. - (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的数据那么我们直接用第三个就比较方便。 下面来一段简单的代码: [java] view plaincopyprint?
  1. - (void)saveImage:(UIImage*)image{  
  2.     ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];  
  3.     [assetsLibrary writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) {  
  4.         if (error) {  
  5.             NSLog(@"Save image fail:%@",error);  
  6.         }else{  
  7.             NSLog(@"Save image succeed.");  
  8.         }  
  9.     }];  
  10. }  

保存video就麻烦点了,你需要先把video写入本地文件然后,获取到本地临时文件的路径,然后调用上面的第四个API写入photo library。 关于写入临时文件,我之前写过一篇关于文件读写的文章,可以去看看。 我这里奉上一个把工程资源库的video写入photo library的demo,这样你就可以把video导入模拟器了,方便有些时候测试。 主要代码如下,整个工程可以再文尾链接下载: [java] view plaincopyprint?
  1. - (void)save:(NSString*)urlString{  
  2.     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];  
  3.     [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:urlString]  
  4.                                 completionBlock:^(NSURL *assetURL, NSError *error) {  
  5.                                     if (error) {  
  6.                                         NSLog(@"Save video fail:%@",error);  
  7.                                     } else {  
  8.                                         NSLog(@"Save video succeed.");  
  9.                                     }  
  10.                                 }];  
  11. }  
整个工程附在后面: SaveVideo2PhotoLibrary(点击下载)