Obj-C检查照片库中是否已存在图像

时间:2015-09-22 09:34:50

标签: ios objective-c image gallery

在我的应用中,我必须实现保存图像功能。我已经像这样管理了保存:

  UIImage *image = [UIImage imageNamed:actualBackground];
  UIImageWriteToSavedPhotosAlbum(
      image, self,
      @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:),
      nil);

/* ... */

- (void)thisImage:(UIImage *)image
    hasBeenSavedInPhotoAlbumWithError:(NSError *)error
                     usingContextInfo:(void *)ctxInfo {
  if (!error){
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    [self presentViewController:picker animated:YES completion:nil];
  }
}

不幸的是,我必须检查文件是否已存在以防止冗余保存。这也是必要的,因为保存多次相同的图像不会覆盖一个文件,但它会创建它的副本......

你知道如何解决这个问题吗?

解:

根据Shravya Boggarapu回答,我将assetUrl存储在我的NSUserDefaults中。完整代码:

- (IBAction)onDownloadClick:(UIButton *)sender {
  UIImage *image = [UIImage imageNamed:actualBackground];

  NSString *key = [NSString stringWithFormat:@"assetsUrl %@", actualBackground];
  NSString *savedValue =
      [[NSUserDefaults standardUserDefaults] stringForKey:key];
  NSURL *url = [NSURL URLWithString:savedValue];
  if (url != nil) {
    PHFetchResult *fetch =
        [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:url]
                                    options:nil];
    if ([fetch count]) {
      UIAlertView *myAlert = [[UIAlertView alloc]
              initWithTitle:nil
                    message:NSLocalizedString(@"Already downloaded", nil)
                   delegate:self
          cancelButtonTitle:@"OK"
          otherButtonTitles:nil];
      [myAlert show];
      return;
    }
  }
  ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

  [library
      writeImageToSavedPhotosAlbum:image.CGImage
                       orientation:(ALAssetOrientation)image.imageOrientation
                   completionBlock:^(NSURL *assetURL, NSError *error) {

                     [library assetForURL:assetURL
                         resultBlock:^(ALAsset *asset) {
                           NSLog(@"assetURL %@", assetURL);
                           NSString *ass = [assetURL absoluteString];
                           [[NSUserDefaults standardUserDefaults]
                               setObject:ass
                                  forKey:key];
                           [[NSUserDefaults standardUserDefaults] synchronize];

                           UIAlertView *myAlert = [[UIAlertView alloc]
                                   initWithTitle:nil
                                         message:NSLocalizedString(
                                                     @"Image downloaded", nil)
                                        delegate:self
                               cancelButtonTitle:@"OK"
                               otherButtonTitles:nil];
                           [myAlert show];
                         }
                         failureBlock:^(NSError *error){
                         }];
                   }];
}

希望它会对某人有所帮助。

2 个答案:

答案 0 :(得分:1)

我有一个解决方案但不适用于所有情况。

将图像保存到相机胶卷的事情是,将图像添加到相机胶卷时会创建assetURL。此外,此资产URL每次都是新的,因此如果您保存到相机胶卷,它将创建一个副本。图像的名称也不会保留。

如果首先通过您的应用将图像添加到相机胶卷,则可以将assetURL存储为图像信息的一部分。

在我的应用程序中,为包含一些关键信息的每个图像维护一个字典。这包括图像的assetURL,如果它保存到相机胶卷。

获得URL后,您可以使用fetchAssetsWithALAssetURLs:options:函数检查其存在。

如果URL为nil或获取时的资源为nil,则表示相机胶卷中不存在该图像。所以你可以重新添加。

答案 1 :(得分:0)

没有简单的方法可以比较两个图像,如果你发现了一个非常繁重的任务,我们可以比较图像的元数据,我们可以将它写入图像,也可以从图像中读取。

You can use this repo for that

ALAssetLibrary也有一些属性来访问图像元信息。如果你谷歌这个你会得到一些。

Like this one