zoukankan      html  css  js  c++  java
  • 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

    在需要的地方调用就可以实现了...

  • 相关阅读:
    20201220第二周学习总结
    师生关系
    快速浏览教材
    学期2020-2021-1学号20201220《信息安全专业导论》第1周学习总结
    编程将字符串s倒序输出,要求利用函数递归实现
    小学生四则运算随机生成程序
    礼炮问题
    C语言最大公约数
    C语言判断三角形类型
    C语言:一元二次方程解的所有情况
  • 原文地址:https://www.cnblogs.com/LzwBlog/p/5703590.html
Copyright © 2011-2022 走看看