Obj-C Check if image already exists in Photos gall

2019-02-24 11:53发布

问题:

In my app I have to implement save image feature. I have managed saving like this:

  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];
  }
}

Unfortunately I have to check if file already exists to prevent redundant saving. Also this is necessary because saving multiple times the same image don't override one file, but it creates copy of it...

Do you know how to solve that problem?

SOLUTION:

According to Shravya Boggarapu answer I'm storing assetUrl in my NSUserDefaults. Complete code:

- (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){
                         }];
                   }];
}

Hope it will help somebody.

回答1:

I have a solution but not one that applies to every situation.

The thing about saving image to camera roll is that there is an assetURL created when you add the image to camera roll. Also, this asset URL is new every time, so if you save to camera roll, it will create a copy. The name of the image is also not retained.

If the image is added to the camera roll through your app in the first place, then you can store the assetURL as part of image information.

In my app, a dictionary is maintained for every image containing some critical info. This includes the assetURL of the image if it is saved to camera roll.

Once you have the URL, you can check its existence by using fetchAssetsWithALAssetURLs:options: function.

If the URL is nil or the asset when fetched is nil, it means that the image does not exist in the camera roll. So you can add anew.



回答2:

There is no easy way to compare two images and if you found one that will surly a heavy task, instead of this we can compare image's meta data which we can write it to image and also read it from images.

You can use this repo for that

And ALAssetLibrary also have some properties to access an images meta info. If you google with this you will surly get some.

Like this one