将照片保存到iPhone相册库中的自定义相册

Ela*_*hts 23 iphone objective-c uiimagepickercontroller uiimage alassetslibrary

我正在尝试在iPhone的照片库中创建自定义相册,然后保存我用相机拍摄的照片,或从手机相机胶卷中选择到该自定义相册的照片.我可以成功创建相册,但照片没有保存在那里,而是他们被保存到模拟器保存的照片专辑...我不知道如何告诉UIImageWriteToSavedPhotosAlbum保存到我刚创建的新专辑addAssetsGroupAlbumWithName. ..

这是我到目前为止的代码 - 我已经删除了几个部分以保持我的代码示例简短...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{     
  NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
  if([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage])
  {        
    // pull GPS information from photos metadata using ALAssetsLibrary
    void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset)
    {
        // code snipped out 
    };
    NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:assetURL
             resultBlock:ALAssetsLibraryAssetForURLResultBlock
            failureBlock:^(NSError *error) 
            {
                // code snipped out
            }];

    // getimage from imagePicker and resize it to the max size of the iPhone screen 
    UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImage *resizedImage = [util_ createThumbnailForImage:originalImage thumbnailSize:[util_ determineIPhoneScreenSize]];
    NSData *imageData = UIImagePNGRepresentation(resizedImage);

                // code snipped out
                // code snipped out
                // code snipped out
                // code snipped out
                // code snipped out
                // code snipped out



    // create a new album called "My Apps Photos"
    [library addAssetsGroupAlbumWithName:@"My Apps Photos"
            resultBlock:^(ALAssetsGroup *group) 
            {
                NSLog(@"in addAssetsGroupAlbumWithName resultBlock");

                // save file to album
                UIImageWriteToSavedPhotosAlbum(resizedImage, self, nil, nil);

            } 
            failureBlock:^(NSError *error) 
            {
                NSLog(@"in addAssetsGroupAlbumWithName failureBlock");

            }
     ];
  }
}
Run Code Online (Sandbox Code Playgroud)

所以...就像我说的那样,它会创建新专辑,但不会将照片保存在那里.如何告诉它保存到新专辑中?也许我听起来UIImageWriteToSavedPhotosAlbum没用?

注意:我使用的是Xcode 4.3.2,IOS 5.1和ARC

Sco*_*len 59

如果您使用的是iOS6,Fernando的答案将无效,因为saveImage选择器不再可用.

这个过程非常令人困惑,我没有看到任何明确的答案,所以这里是我在iOS6中用来解决这个问题的方法.

您需要使用以下组合:

创建相册:

[self.library addAssetsGroupAlbumWithName:albumName 
                              resultBlock:^(ALAssetsGroup *group) {
         NSLog(@"added album:%@", albumName);
}
                             failureBlock:^(NSError *error) {
         NSLog(@"error adding album");
}];
Run Code Online (Sandbox Code Playgroud)

查找相册:

__block ALAssetsGroup* groupToAddTo;
[self.library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                             usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
      if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:albumName]) {
          NSLog(@"found album %@", albumName);
          groupToAddTo = group;
      }
}
                           failureBlock:^(NSError* error) {
     NSLog(@"failed to enumerate albums:\nError: %@", [error localizedDescription]);
}];
Run Code Online (Sandbox Code Playgroud)

将图像保存到资源库,并将其放入相册:

CGImageRef img = [image CGImage];
[self.library writeImageToSavedPhotosAlbum:img
                                  metadata:[info objectForKey:UIImagePickerControllerMediaMetadata]
                           completionBlock:^(NSURL* assetURL, NSError* error) {
     if (error.code == 0) {
         NSLog(@"saved image completed:\nurl: %@", assetURL);

         // try to get the asset
         [self.library assetForURL:assetURL
                       resultBlock:^(ALAsset *asset) {
              // assign the photo to the album
              [groupToAddTo addAsset:asset];
              NSLog(@"Added %@ to %@", [[asset defaultRepresentation] filename], albumName);
          }
                      failureBlock:^(NSError* error) {
              NSLog(@"failed to retrieve image asset:\nError: %@ ", [error localizedDescription]);
          }];
     }
     else {
         NSLog(@"saved image failed.\nerror code %i\n%@", error.code, [error localizedDescription]);
     }
 }];
Run Code Online (Sandbox Code Playgroud)


小智 11

费尔南多的回答在iOS 7中对我有用.

脚步 :

1)从这里下载ALAssetsLibrary + CustomPhotoAlbum代码:http://www.touch-code-magazine.com/wp-content/uploads/2011/11/ALAssetsLibrary_CustomPhotoAlbum.zip? a071b6 并复制您的类别中的2个文件Xcode项目.

2)在头文件中,添加以下行

#import <AssetsLibrary/AssetsLibrary.h>
#import "ALAssetsLibrary+CustomPhotoAlbum.h"

@property (strong, atomic) ALAssetsLibrary* library;
Run Code Online (Sandbox Code Playgroud)

3)在您的实现文件中,添加以下行

@synthesize library=_library;
Run Code Online (Sandbox Code Playgroud)

编辑:4)初始化资产库实例,最好是"viewDidLoad"方法,否则下面的saveImage方法将不会执行.(已确认):

[我正在重新提交建议的编辑,因为有非iphone技能的人拒绝了之前的提交.这无疑是@santhu和Fernando的一个很好的答案,并帮助了我很多,但是,初始化的代码片段丢失了所以我花了一些时间来弄清楚为什么代码不起作用.因此,如果拥有iPhone开发技能的版主审核编辑,我将不胜感激.

_library = [[ALAssetsLibrary alloc] init];
Run Code Online (Sandbox Code Playgroud)

5)在要保存的方法中添加它

  //Add this in the method where you wish to save
  [self.library saveImage:(UIImage *) toAlbum:(NSString *) withCompletionBlock:^(NSError                 *error) {
    if (error!=nil) {
        NSLog(@"Big error: %@", [error description]);
    }
}];
Run Code Online (Sandbox Code Playgroud)


War*_*olf 9

对于快速用户: - 我做了相同的功能.

declare closure大小类定义(上面的类定义)

typealias CompletionHandler = (success:Bool!) -> Void  
Run Code Online (Sandbox Code Playgroud)

在类中声明库变量

var library:ALAssetsLibrary?;
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad中初始化变量

library = ALAssetsLibrary();
Run Code Online (Sandbox Code Playgroud)

将图像添加到特定相册的方法

func addImage(image:UIImage, metaData:NSDictionary, toAlbum albumName:String, handler:CompletionHandler){

    library?.addAssetsGroupAlbumWithName(albumName, resultBlock: {(group:ALAssetsGroup!) -> Void in
        print("\nAlbum Created:=  \(albumName)");
        /*-- Find Group --*/

        var groupToAddTo:ALAssetsGroup?;

        self.library?.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAlbum),
            usingBlock: { (group:ALAssetsGroup?, stop:UnsafeMutablePointer<ObjCBool>) -> Void in

                if(group != nil){

                    if group!.valueForProperty(ALAssetsGroupPropertyName) as String == albumName{
                        groupToAddTo = group;

                        print("\nGroup Found \(group!.valueForProperty(ALAssetsGroupPropertyName))\n");

                        self.library?.writeImageToSavedPhotosAlbum(image.CGImage, metadata:metaData, completionBlock: {(assetURL:NSURL!,error:NSError!) -> Void in

                            if(error == nil){
                                self.library?.assetForURL(assetURL,
                                    resultBlock: { (asset:ALAsset!) -> Void in
                                        var yes:Bool? = groupToAddTo?.addAsset(asset);
                                        if (yes == true){
                                            handler(success: true);
                                        }
                                    },
                                    failureBlock: { (error2:NSError!) -> Void in
                                        print("Failed to add asset");
                                        handler(success: false);
                                });
                            }
                        });
                    }
                } /*Group Is Not nil*/
            },
            failureBlock: { (error:NSError!) -> Void in
                print("Failed to find group");
                handler(success: false);
        });

        }, failureBlock: { (error:NSError!) -> Void in
            print("Failed to create \(error)");
            handler(success: false);
    });
}
Run Code Online (Sandbox Code Playgroud)

将此方法称为: -

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){

    var image:UIImage = info[UIImagePickerControllerOriginalImage] as UIImage;
    var metadata:NSDictionary = info[UIImagePickerControllerMediaMetadata] as NSDictionary;

    self.addImage(image, metaData: metadata, toAlbum: "SwiftAlbum") { (success) -> Void in
        print("Image Added : \(success)");
    }

    picker.dismissViewControllerAnimated(true, completion: nil);
}
Run Code Online (Sandbox Code Playgroud)

  • ALAssetsLibrary将在iOS 9.0中弃用 (3认同)