iOS將圖片保存到指定相冊

http://bluereader.org/article/102764087git

 

iOS系統提供了保存圖片的方法,可是該方法有一個弊端,該方法沒法指定要保存圖片的相冊名稱。
UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo); 目前不少圖片相關應用都會將圖片寫入指定相冊,下面提供簡單的寫入指定相冊的方法。
我大概設計了這麼幾個接口,以下代碼所示github

[STAlumbManager.h] [url] [link text]atom

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 
@class UIImage; typedef void (^STAlbumSaveHandler)(UIImage *image, NSError *error); /**  * @brief 將圖片寫入相冊,使用ALAssetLibrary  *  * @param image 須要寫入的圖片  * @param album 相冊名稱,若是相冊不存在,則新建相冊  * @param completionHandler 回調  */ extern void STImageWriteToPhotosAlbum(UIImage *image, NSString *album, STAlbumSaveHandler completionHandler); @interface STAlbumManager : NSObject + (instancetype)sharedManager; /**  * @brief 將圖片寫入相冊,使用ALAssetLibrary  *  * @param image 須要寫入的圖片  * @param album 相冊名稱,若是相冊不存在,則新建相冊  * @param completionHandler 回調  */ - (void)saveImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler; @end @interface ALAssetsLibrary (STAssetsLibrary) - (void)writeImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler; @end


實現文件url

[STAlumbManager.m] [url] [link text]spa

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 
#import "STAlbumManager.h" #import <UIKit/UIKit.h> void STImageWriteToPhotosAlbum(UIImage *image, NSString *album, STAlbumSaveHandler completionHandler) {  [[STAlbumManager sharedManager] saveImage:image toAlbum:album completionHandler:completionHandler]; } @interface STAlbumManager () @property(nonatomic, strong) ALAssetsLibrary *assetsLibrary; @end @implementation STAlbumManager static STAlbumManager *_sharedManager; + (instancetype)sharedManager {  static dispatch_once_t onceToken;  dispatch_once(&onceToken, ^{ _sharedManager = [[self alloc] init]; });  return _sharedManager; } - (instancetype)init {  self = [super init];  if (self) {  }  return self; } - (ALAssetsLibrary *)assetsLibrary {  if (!_assetsLibrary) {  _assetsLibrary = [[ALAssetsLibrary alloc] init];  }  return _assetsLibrary; } - (void)saveImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler {  [self.assetsLibrary writeImage:image  toAlbum:album  completionHandler:^(UIImage *image, NSError *error) {  if (completionHandler) {  completionHandler(image, error);  }  /// 注意,這裏每次都置空是由於期間若是操做相冊了,下次保存以前但願能取到最新狀態。  self.assetsLibrary = nil;  }]; } @end @implementation ALAssetsLibrary (STAssetsLibrary) - (void)writeImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler {  [self writeImageToSavedPhotosAlbum:image.CGImage  orientation:(ALAssetOrientation)image.imageOrientation  completionBlock:^(NSURL *assetURL, NSError *error) {  if (error) {  if (completionHandler) {  completionHandler(image, error);  }  } else {  [self addAssetURL:assetURL  toAlbum:album  completionHandler:^(NSError *error) {  if (completionHandler) {  completionHandler(image, error);  }  }];  }  }]; } - (void)addAssetURL:(NSURL*)assetURLtoAlbum:(NSString*)albumcompletionHandler:(ALAssetsLibraryAccessFailureBlock)completionHandler{void(^assetForURLBlock)(NSURL*,ALAssetsGroup*)=^(NSURL*URL,ALAssetsGroup*group){[selfassetForURL:assetURLresultBlock:^(ALAsset*asset){[groupaddAsset:asset];completionHandler(nil);}failureBlock:^(NSError*error){completionHandler(error);}];};__blockALAssetsGroup*group;[selfenumerateGroupsWithTypes:ALAssetsGroupAlbumusingBlock:^(ALAssetsGroup*_group,BOOL*stop){if([albumisEqualToString:[_groupvalueForProperty:ALAssetsGroupPropertyName]]){group=_group;}if(!_group){/// 循環結束if(group){assetForURLBlock(assetURL,group);}else{[selfaddAssetsGroupAlbumWithName:albumresultBlock:^(ALAssetsGroup*group){assetForURLBlock(assetURL,group);}failureBlock:completionHandler];}}}failureBlock:completionHandler];}@end

簡單介紹一下代碼的使用方法
該接口定義申明瞭一個 C方法,用來提供便捷的保存調用,使用方能夠直接經過調用
extern void STImageWriteToPhotosAlbum(UIImage *image, NSString *album, STAlbumSaveHandler completionHandler);
就能夠直接保存對應的image到對應的album,若是沒有找到album,則會建立新的album,圖片保存完畢以後,會調用block回調。
或者使用Manager單例所提供的方法 - (void)saveImage:(UIImage *)image toAlbum:(NSString *)album completionHandler:(STAlbumSaveHandler)completionHandler 
這樣就實現了將圖片保存到指定相冊,感謝 技術笨 提供Demo設計

相關文章
相關標籤/搜索