iOS--將圖片保存至本地相冊


今天做聊天,領導說對方給我發一個圖片,我要保存到本地,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

 

在需要的地方調用就可以實現了...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM