iOS-保存图片到(自定义)相册步骤

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000; background-color: #ffffff }

保存到相册步骤:

1.保存图片到【相机胶卷】

2.拥有一个【自定义相册】

3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】

保存图片到【相机胶卷】

/*
 一、保存图片到【自定义相册】
 1.保存图片到【相机胶卷】
 1> C语言函数UIImageWriteToSavedPhotosAlbum
 2> AssetsLibrary框架
 3> Photos框架

 2.拥有一个【自定义相册】
 1> AssetsLibrary框架
 2> Photos框架

 3.添加刚才保存的图片到【自定义相册】
 1> AssetsLibrary框架
 2> Photos框架
 */
- (IBAction)save:(UIButton *)sender {
    /*
     保存到相册步骤:
     1.保存图片到【相机胶卷】
     2.拥有一个【自定义相册】
     3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】
     */
    UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        [SVProgressHUD showErrorWithStatus:@"保存失败!"];
    } else {
        [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
    }
}
/*
//补充
 错误信息:-[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
 错误解释:参数越界错误,方法的参数个数和实际传递的参数个数不一致
 */

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Yuanti SC"; color: #000000; background-color: #ffffff }

Photos框架详解和保存图片

1.Photos框架详解

/*
二、Photos框架须知
 1.PHAsset : 一个PHAsset对象就代表相册中的一张图片或者一个视频
 1> 查 : [PHAsset fetchAssets...]
 2> 增删改 : PHAssetChangeRequest(包括图片\视频相关的所有改动操作)

 2.PHAssetCollection : 一个PHAssetCollection对象就代表一个相册
 1> 查 : [PHAssetCollection fetchAssetCollections...]
 2> 增删改 : PHAssetCollectionChangeRequest(包括相册相关的所有改动操作)

 3.对相片\相册的任何【增删改】操作,都必须放到以下方法的block中执行
 -[PHPhotoLibrary performChanges:completionHandler:]
 -[PHPhotoLibrary performChangesAndWait:error:]
 */

/*
 Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRef
 NSString *string = (__bridge NSString *)kCFBundleNameKey;
 CFStringRef string = (__bridge CFStringRef)@"test";

 获得相机胶卷相册
 [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]
 */

/*
 错误信息:This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]
  // 异步执行修改操作
 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
 [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
 } completionHandler:^(BOOL success, NSError * _Nullable error) {
 if (error) {
 [SVProgressHUD showErrorWithStatus:@"保存失败!"];
 } else {
 [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
 }
 }];

 // 同步执行修改操作
 NSError *error = nil;
 [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
 [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
 } error:&error];
 if (error) {
 [SVProgressHUD showErrorWithStatus:@"保存失败!"];
 } else {
 [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
 }
*/

2.Photos框架保存图片到相机胶卷

- (IBAction)save:(UIButton *)sender {
    /*
     保存到相册步骤:
     1.保存图片到【相机胶卷】
     2.拥有一个【自定义相册】
     3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】
     */
    NSError *error = nil;

    // 保存图片到【相机胶卷】
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
    } error:&error];

    if (error) {
        [SVProgressHUD showErrorWithStatus:@"保存失败!"];
    } else {
        [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
    }
}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Yuanti SC"; color: #000000; background-color: #ffffff }

②拥有一个【自定义相册】

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000; background-color: #ffffff }

Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRef

NSString *string = (__bridge NSString *)kCFBundleNameKey;

CFStringRef string = (__bridge CFStringRef)@"test";

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Yuanti SC"; color: #000000; background-color: #ffffff }

1.创建一个【自定义相册】

/** 当前App对应的自定义相册 */
- (PHAssetCollection *)createdCollection;

- (IBAction)save:(UIButton *)sender {
    /*
     保存到相册步骤:
     1.保存图片到【相机胶卷】
     2.拥有一个【自定义相册】
     3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】
     */
    [self createdCollection];
}

#pragma mark - 获得当前App对应的自定义相册
- (PHAssetCollection *)createdCollection
{
    // 获得软件名字
    NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];

    // 抓取所有的自定义相册
    PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    // 查找当前App对应的自定义相册
    for (PHAssetCollection *collection in collections) {
        if ([collection.localizedTitle isEqualToString:title]) {
            return collection;
        }
    }

    /** 当前App对应的自定义相册没有被创建过 **/
    // 创建一个【自定义相册】
    NSError *error = nil;
    __block NSString *createdCollectionID = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{       createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
    } error:&error];

    if (error) {
        [SVProgressHUD showErrorWithStatus:@"创建相册失败!"];
        return nil;
    }

    // 根据唯一标识获得刚才创建的相册
    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;
}
/*
 Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRef
 NSString *string = (__bridge NSString *)kCFBundleNameKey;
 CFStringRef string = (__bridge CFStringRef)@"test";

 获得相机胶卷相册
 [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]
 */

2.获取相册

#pragma mark - 获得当前App对应的自定义相册
// 根据唯一标识获得刚才创建的相册
 return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;

3.保存图片到自定义相册

/** 当前App对应的自定义相册 */
- (PHAssetCollection *)createdCollection;
/** 返回刚才保存到【相机胶卷】的图片 */
- (PHFetchResult<PHAsset *> *)createdAssets;

- (IBAction)save:(UIButton *)sender {
    PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];

    // 请求\检查访问权限 :
    // 如果用户还没有做出选择,会自动弹框,用户对弹框做出选择后,才会调用block
    // 如果之前已经做过选择,会直接执行block
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (status == PHAuthorizationStatusDenied) { // 用户拒绝当前App访问相册
                if (oldStatus != PHAuthorizationStatusNotDetermined) {
                    HKLog(@"提醒用户打开开关")
                }
            } else if (status == PHAuthorizationStatusAuthorized) { // 用户允许当前App访问相册
                [self saveImageIntoAlbum];
            } else if (status == PHAuthorizationStatusRestricted) { // 无法访问相册
                [SVProgressHUD showErrorWithStatus:@"因系统原因,无法访问相册!"];
            }
        });
    }];
}

/**
 *  保存图片到相册
 */
- (void)saveImageIntoAlbum
{
    // 获得相片
    PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
    if (createdAssets == nil) {
        [SVProgressHUD showErrorWithStatus:@"保存图片失败!"];
        return;
    }

    // 获得相册
    PHAssetCollection *createdCollection = self.createdCollection;
    if (createdCollection == nil) {
        [SVProgressHUD showErrorWithStatus:@"创建或者获取相册失败!"];
        return;
    }

    // 添加刚才保存的图片到【自定义相册】
    NSError *error = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];
        [request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];
    } error:&error];

    // 最后的判断
    if (error) {
        [SVProgressHUD showErrorWithStatus:@"保存图片失败!"];
    } else {
        [SVProgressHUD showSuccessWithStatus:@"保存图片成功!"];
    }
}

#pragma mark - 获得当前App对应的自定义相册
- (PHAssetCollection *)createdCollection
{
    // 获得软件名字
    NSString *title = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];

    // 抓取所有的自定义相册
    PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    // 查找当前App对应的自定义相册
    for (PHAssetCollection *collection in collections) {
        if ([collection.localizedTitle isEqualToString:title]) {
            return collection;
        }
    }

    /** 当前App对应的自定义相册没有被创建过 **/
    // 创建一个【自定义相册】
    NSError *error = nil;
    __block NSString *createdCollectionID = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
    } error:&error];

    if (error) return nil;

    // 根据唯一标识获得刚才创建的相册
    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;
}

- (PHFetchResult<PHAsset *> *)createdAssets
{
    NSError *error = nil;
    __block NSString *assetID = nil;

    // 保存图片到【相机胶卷】
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
    } error:&error];

    if (error) return nil;

    // 获取刚才保存的相片
    return [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil];
}

//补充:不带权限判断
//- (IBAction)save {
//    NSError *error = nil;
//
//    // 保存图片到【相机胶卷】
//    __block PHObjectPlaceholder *placeholder = nil;
//    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//        placeholder = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset;
//    } error:&error];
//    if (error) {
//        [SVProgressHUD showErrorWithStatus:@"保存图片失败!"];
//        return;
//    }
//
//    // 获得相册
//    PHAssetCollection *createdCollection = self.createdCollection;
//    if (createdCollection == nil) {
//        [SVProgressHUD showErrorWithStatus:@"创建相册失败!"];
//        return;
//    }
//
//    // 添加刚才保存的图片到【自定义相册】
//    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//        PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];
//        [request insertAssets:@[placeholder] atIndexes:[NSIndexSet indexSetWithIndex:0]];
//    } error:&error];
//
//    // 最后的判断
//    if (error) {
//        [SVProgressHUD showErrorWithStatus:@"保存图片失败!"];
//    } else {
//        [SVProgressHUD showSuccessWithStatus:@"保存图片成功!"];
//    }
//}

原文地址:https://www.cnblogs.com/StevenHuSir/p/SavePhotoAndAlbum.html

时间: 2024-08-02 20:15:50

iOS-保存图片到(自定义)相册步骤的相关文章

iOS开发中自定义相册功能性能改善

大多数项目中都会用到相册浏览和选择功能,如果需要使用到自定义相册浏览器,那么,性能优化将是一个很重要的课题.毕竟操作对象是图片这样相对较大写数据单位.今天就针自定义相册浏览选择器四个优化点进行剖析: 缩略图页面加载速度优化 缩略图页面滑动流畅度优化 大图浏览滑动流畅度优化 内存优化 先看看自定义相册的两个主要界面: 1.缩略图页面加载速度优化 如果本地相册有200张以上的照片,那么缩略图页面的加载速度就显得尤为重要. 首先,要保证缩略图界面的控制器在没有加载照片的时候,从viewDidLoad到

ios 保存图片到自己创建的相册

在QQ群里面看到有人问保存图片到自定义相册的办法: 直接上代码: #import <Foundation/Foundation.h> #import <AssetsLibrary/AssetsLibrary.h> typedef void(^SaveImageCompletion)(NSError* error); @interface ALAssetsLibrary(CustomPhotoAlbum) -(void)saveImage:(UIImage*)image toAlbu

iOS 开发: 自定义相册, 保存多张图片到自定义相册中

1.自定义相册(兼容 iOS7 iOS8) - (void)viewDidLoad { //search all photo albums in the library    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop)     {         //compare the names of the albums        

iOS开发——实用技术OC篇&amp;关于自定义相册删除复活的实现

关于自定义相册删除复活的实现 在这里(http://www.cnblogs.com/iCocos/p/4705585.html)我们提到了. 1:简单的实现了获取系统相册图片并且保存图片到系统相册 2:定义自定义的相册,并且保存到自定义相册 这里久以一个简单的例子实现一个上面的所有功能,并且添加一个很有用的功能实现 App中自定义的相册呗删除之后再次保存相片无法成功 这里使用的是一个系统的库:ALAssetsLibrary 先来看看咱们取得相册中的相片 1 - (void)getAllPhoto

【转】IOS版本自定义字体步骤

本文转载自:http://quick.cocoachina.com/wiki/doku.php?id=ios%E7%89%88%E6%9C%AC%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93%E6%AD%A5%E9%AA%A4 比如字体文件名叫abc.ttf, 用mac字体工具查到字体的名称: PostScript名称 FZYHJW--GB1-0 全名 方正艺黑简体 这个PostScript 名称就是我们的字体名称,

IOS 保存图片至相册

IOS 保存图片至相册 应用中有时我们会有保存图片的需求,如利用UIImagePickerController用IOS设备内置的相机拍照,或是有时我们在应用程序中利用UIKit的 UIGraphicsBeginImageContext,UIGraphicsEndImageContext,UIGraphicsGetImageFromCurrentImageContext方法创建一张图像需要进行保存. IOS的UIKit Framework提供了UIImageWriteToSavedPhotosAl

iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码

iOS精选源码 企业级开源项目,模仿艺龙旅行App 标签选择器--LeeTagView CSSegmentedControl常用的分段选择器,简单易用! 仿微信左滑删除 IOS左滑返回 输入框 iOS 基于PhotoKit框架的自定义相册 JHDraw - 画线,画虚线,画五角星,画矩形,画虚线矩形 标度尺 对对碰小游戏 iOS优质博客 iOS无痕埋点方案分享探究 前言当前互联网行业的竞争已经是非常激烈了, "功能驱动"的时代已经过去了, 现在更加注重软件的细节, 以及用户的体验问题.

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘的.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看

?Xamarin iOS教程之自定义视图

Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图. [示例2-33]以下将实现一个自定义的视图.当用户触摸屏幕时,就会出现一个显示手指当前位置的标签视图,以及改变主视图的背景颜色.代码如下: (1)创建一个Single View Application类型的工程,命名为2-13. (2)添加一个C#的类文件,并命名为MyView,具体步骤如下: 首先,选择菜单栏中的文件|New