今天做聊天,領導說對方給我發一個圖片,我要保存到本地,IOS的UIKit Framework提供了UIImageWriteToSavedPhotosAlbum方法對圖像進行保存,該方法會將image保存至用戶的相冊中:
上代碼:
void UIImageWriteToSavedPhotosAlbum ( UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo );
參數說明:
image : 需要保存的圖片對象
id : 響應方法對象
SEL : 選擇方法
步驟:
/** * 將圖片添加到本地相冊 */ - (void)addImageViewTolocal{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:_currentItem.imageURL]]; UIImage *myImage = [UIImage imageWithData:data]; [self saveImageToPhotos:myImage]; }
步驟二:
- (void)saveImageToPhotos:(UIImage*)savedImage { UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); }
步驟三:
- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { NSString *msg = nil ; if(error != NULL){ msg = @"保存圖片失敗" ; }else{ msg = @"保存圖片成功" ; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存圖片結果提示" message:msg delegate:self cancelButtonTitle:@"確定" otherButtonTitles:nil]; [alert show]; }
這樣就可以實現將圖片保存至本地相冊;
2016. 9.4 今天優化上面的方法,只能保存到相冊,而不能保存到指定相冊,我只接上代碼了,
首先需要導入系統的庫:

創建一個管理類:

.h
#import <Foundation/Foundation.h> #import <AssetsLibrary/AssetsLibrary.h> @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
.m
#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 *)assetURL toAlbum:(NSString *)album completionHandler:(ALAssetsLibraryAccessFailureBlock)completionHandler { void (^assetForURLBlock)(NSURL *, ALAssetsGroup *) = ^(NSURL *URL, ALAssetsGroup *group) { [self assetForURL:assetURL resultBlock:^(ALAsset *asset) { [group addAsset:asset]; completionHandler(nil); } failureBlock:^(NSError *error) { completionHandler(error); }]; }; __block ALAssetsGroup *group; [self enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *_group, BOOL *stop) { if ([album isEqualToString:[_group valueForProperty:ALAssetsGroupPropertyName]]) { group = _group; } if (!_group) { /// 循環結束 if (group) { assetForURLBlock(assetURL, group); } else { [self addAssetsGroupAlbumWithName:album resultBlock:^(ALAssetsGroup *group) { assetForURLBlock(assetURL, group); } failureBlock:completionHandler]; } } } failureBlock:completionHandler]; } @end
在需要的地方調用就可以實現了...
