iOS如何将照片保存到相册

本文实例为大家分享了iOS将照片保存到相册的具体代码,供大家参考,具体内容如下

在使用前  请导入photos.framework

然后导入

#import <Photos/PHPhotoLibrary.h>
#import <Photos/PHAssetChangeRequest.h>
#import <Photos/PHImageManager.h>

方法一

使用UIImageWriteToSavedPhotosAlbum函数将图片保存到相册,如:

- (void)loadImageFinished:(UIImage *)image
{
  UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void *)self);
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
  NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);
}

第一个参数是要保存到相册的图片对象

第二个参数是保存完成后回调的目标对象

第三个参数就是保存完成后回调到目标对象的哪个方法中,方法的声明要如代码中所示的:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

第四个参数在保存完成后,会原封不动地传回到回调方法的contextInfo参数中。

方法二

使用AssetsLibrary框架中的ALAssetsLibrary类来实现。具体代码如下:

- (void)loadImageFinished:(UIImage *)image
{
  __block ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
  [lib writeImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {

    NSLog(@"assetURL = %@, error = %@", assetURL, error);
    lib = nil;

  }];
}

使用了ALAssetsLibrary类的writeImageToSavedPhotosAlbum:metadata:completionBlock:方法实现。其中第一个参数是一个CGImageRef的对象,表示要传入的图片。第二个参数是图片的一些属性,这里没有设置所以传入nil。最后一个completionBlock是保存完成后的回调,在这个回调中可以取到保存后的图片路径以及保存失败时的错误信息。

注意:使用该类时需要导入AssetsLibrary.framework。而且该类需要在iOS4.0以上可以使用,但是在iOS9.0之后就被标记为过时方法。官方建议使用Photos.framework中的PHPhotoLibrary进行代替,也就是下面所说的第三种方法。

方法三

使用Photos框架的PHPhotoLibrary类来实现保存到相册功能。代码如下:

- (void)loadImageFinished:(UIImage *)image
{
  [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

     /写入图片到相册
     PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

   } completionHandler:^(BOOL success, NSError * _Nullable error) {

     NSLog(@"success = %d, error = %@", success, error);

  }];
}

该例子中先调用PHPhotoLibrary类的performChanges:completionHandler:方法,然后在它的changeBlock中,通过PHAssetChangeRequest类的creationRequestForAssetFromImage:方法传入一个图片对象即可实现保存到相册的功能。然后completionHandler中会告诉我们是否操作成功。

进阶使用:得到保存到相册的图片对象

也许会有人需要在保存相册后得到图片的PHAsset对象来进行后续操作(昨天刚好碰到有朋友遇到这样的问题)。那么,这里对上面例子进行改进,在创建PHAssetChangeRequest后将它的placeholderForCreatedAsset属性的localIdentifier属性保存到一个数组中,等待操作完成后再通过这个数组来查找刚刚添加的图片对象。请看下面栗子:

- (void)loadImageFinished:(UIImage *)image
{
  NSMutableArray *imageIds = [NSMutableArray array];
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

      //写入图片到相册
      PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
      //记录本地标识,等待完成后取到相册中的图片对象
      [imageIds addObject:req.placeholderForCreatedAsset.localIdentifier];

    } completionHandler:^(BOOL success, NSError * _Nullable error) {

      NSLog(@"success = %d, error = %@", success, error);

      if (success)
      {
        //成功后取相册中的图片对象
        __block PHAsset *imageAsset = nil;
        PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:imageIds options:nil];
        [result enumerateObjectsUsingBlock:^(PHAsset * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

          imageAsset = obj;
          *stop = YES;

        }];

        if (imageAsset)
        {
          //加载图片数据
          [[PHImageManager defaultManager] requestImageDataForAsset:imageAsset
             options:nil
             resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {

                NSLog("imageData = %@", imageData);

             }];
        }
      }

    }];
}

总结

第一种方式是最常用的,使用起来很方便,传入UIImage就可以了,也不需要担心iOS不同版本的问题。唯一缺点就是无法找到对应添加的图片。

第二种方式是iOS4之后加入的,在iOS9后又不推荐使用了。他也提供了很直观的方式来保存图片,并且也能够取到保存后相对应的图片路径。

第三种方式是iOS8之后加入的,他的使用稍微复杂一点,但是它允许进行批量的操作,例如添加、修改、删除等。如果要做更加复杂的操作的话,这种方式是比较推荐的方式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS保存App中的照片到系统相册或自建相册的方法

    保存照片到系统相册 保存照片到系统相册这个功能很多社交类的APP都有的,今天我们简单讲解一下,如何将图片保存到系统相册(Photo Album). 1.创建UIImageView 创建UIImageView是为了将照片展示出来,我们是要把UIImage保存到系统相册(Photo Album): 复制代码 代码如下: #define SCREEN [UIScreen mainScreen].bounds.size self.image = [UIImage imageNamed:@"iOSDevT

  • iOS中读取照片库及保存图片或视频到照片库的要点解析

    读取照片库PhotoLibrary iOS中如果我们只有一次读取一张图片或者一个视频(或拍一张照片/视频)的需求,那么我们用 UIImagePickerController 就可以搞定.但是很多时候我们需要一次性从PhotoLibrary读取多个照片或者视频,这时候我们就需要另辟蹊径了,好在apple为我们提供了相应的接口. 在开始coding之前我们想要认识几个类: ALAssetsLibrary:代表整个PhotoLibrary,我们可以生成一个它的实例对象,这个实例对象就相当于是照片库的句

  • iOS如何将照片保存到相册

    本文实例为大家分享了iOS将照片保存到相册的具体代码,供大家参考,具体内容如下 在使用前  请导入photos.framework 然后导入 #import <Photos/PHPhotoLibrary.h> #import <Photos/PHAssetChangeRequest.h> #import <Photos/PHImageManager.h> 方法一 使用UIImageWriteToSavedPhotosAlbum函数将图片保存到相册,如: - (void)

  • iOS 把图片保存到相册,并获取图片文件名的实例

    实例如下所示: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; if (picker.sourceType == UIImagePickerControllerSo

  • iOS实现视频下载并自动保存到相册功能

    iOS视频下载功能实现,并自动保存到相册(有MBProgressHUD 可以解开注释),供大家参考,具体内容如下 视频类定义属性 ///@property (nonatomic,strong) MBProgressHUD *hud; @property (nonatomic,strong) NSURLSession *session; ///视频播放和下载用的url @property (nonatomic,strong) NSURL *url; ///初始化session - (NSURLSe

  • iOS 沙盒图片保存读取实例

    实例如下所示: //保存图片 -(void)saveImageDocuments:(UIImage *)image{ //拿到图片 UIImage *imagesave = image; NSString *path_sandox = NSHomeDirectory(); //设置一个图片的存储路径 NSString *imagePath = [path_sandox stringByAppendingString:@"/Documents/test.png"]; //把图片直接保存到

  • Android实现长按图片保存至相册功能

    前言:前面写了一篇reactnative的学习笔记,说reactnative的Android框架中有很多福利,确实是的,也说到了我们app中的一个把图片保存到相册的功能,好吧,还是准备写一篇博客,就当笔记了- 先上几张app的图片: 一进app就是一个进度条加载图片(我待会也会说一下进度条view跟怎么监听图片加载过程): 图片加载完毕后: 长按图片进入相册可以看到我们保存的图片: 监听图片加载的loaddingview源码(不是很难,我就直接贴代码了): package com.leo.cam

  • Flutter 生成图片保存至相册的示例

    目录 基本思路 添加依赖 实现代码 遇到一个需求,需要用 Flutter 生成图片,最终实现的效果如下: 基本思路 使用 Canvas 绘制图片中各元素,然后使用 PictureRecorder 进行记录生成. 添加依赖 qr_flutter: ^3.1.0 image_gallery_saver: ^1.2.2 fluttertoast: ^4.0.0 实现代码 import 'dart:ui' as ui; import 'dart:ui'; import 'package:flutter/

  • Android 图片保存到相册不显示的解决方案(兼容Android 10及更高版本)

    目录 前言 问题 解决问题 前言 写了一个demo,简单逻辑就是:在一个图片上添加一行文字或者是水印,并且保存到系统相册,也就是我们手机上的图库.前面编辑图片添加水印都没有问题,到后面保存到系统相册出现了问题:显示不出来图片. 问题 在 Android 10 之前保存系统相册的三步骤: 保存图片到手机 把图片插入到手机图库 发广播更新 代码如下: public static void savePhotoAlbum(Context context, Bitmap bmp) { // 首先保存图片

  • Android实现生成二维码并保存到相册

    效果图如下 保存的图片效果是: 保存到本地的,是整个视图,不只是单单的二维码的图片, 在了解的一番过程之后,我知道了, 1.首先要去获取保存图片的写入权限:(使用 https://github.com/getActivity/XXPermissions) 2. 保存指定view的bitmap (这一步,) 3.保存到相册 直接上代码: private val mBitmapUrl = "wwwww://WL3687211525992373----" private lateinit v

  • iOS开发-调用系统相机和相册获取照片示例

    前言:相信大家都知道大部分的app都是有我的模块的,而在我的模块基本都有用户的头像等信息,并且是可以更改头像的.那么今天小编给大家简单介绍一下iOS开发中如何调用系统相机拍照或者相册获取照片.要获取系统相机或者相册,我们需要使用到 UIImagePickerController 这个类.下面我们来看一下如何实现: 首先,需要遵循 UIImagePickerController 代理的两个协议: <UIImagePickerControllerDelegate, UINavigationContr

随机推荐