iOS将图片保存到指定相册

来源:互联网 发布:如何查看端口是否开放 编辑:程序博客网 时间:2024/05/16 00:38

http://bluereader.org/article/102764087

iOS系统提供了保存图片的方法,但是该方法有一个弊端,该方法无法指定要保存图片的相册名称。
UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo); 目前很多图片相关应用都会将图片写入指定相册,下面提供简单的写入指定相册的方法。
我大概设计了这么几个接口,如下代码所示

[STAlumbManager.h] [url] [link text]
1234567891011121314151617181920212223242526272829303132
@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


实现文件

[STAlumbManager.m] [url] [link text]
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
#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 STAlbumManagerstatic 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

简单介绍一下代码的使用方法
该接口定义申明了一个 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


0 0