您的位置:首页 > 移动开发 > IOS开发

iOS将图片保存到指定相册

2016-03-09 09:52 501 查看
http://bluereader.org/article/102764087

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

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

这样就实现了将图片保存到指定相册,感谢 技术笨 提供[url=https://github.com/lovesunstar/STAlbumManagerDemo]Demo" target=_blank> [link text]

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

实现文件

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

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
3233
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

这样就实现了将图片保存到指定相册,感谢 技术笨 提供[url=https://github.com/lovesunstar/STAlbumManagerDemo]Demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: