在我的应用中,我必须实现保存图像功能。我已经像这样管理了保存:
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){
}];
}];
}
希望它会对某人有所帮助。
答案 0 :(得分:1)
我有一个解决方案但不适用于所有情况。
将图像保存到相机胶卷的事情是,将图像添加到相机胶卷时会创建assetURL。此外,此资产URL每次都是新的,因此如果您保存到相机胶卷,它将创建一个副本。图像的名称也不会保留。
如果首先通过您的应用将图像添加到相机胶卷,则可以将assetURL存储为图像信息的一部分。
在我的应用程序中,为包含一些关键信息的每个图像维护一个字典。这包括图像的assetURL,如果它保存到相机胶卷。
获得URL后,您可以使用fetchAssetsWithALAssetURLs:options:
函数检查其存在。
如果URL为nil或获取时的资源为nil,则表示相机胶卷中不存在该图像。所以你可以重新添加。
答案 1 :(得分:0)
没有简单的方法可以比较两个图像,如果你发现了一个非常繁重的任务,我们可以比较图像的元数据,我们可以将它写入图像,也可以从图像中读取。
You can use this repo for that
ALAssetLibrary也有一些属性来访问图像元信息。如果你谷歌这个你会得到一些。