在我的应用程序中,我必须实现保存图像功能。我已经成功地保存了这样的内容:
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){
}];
}];
}
希望它能帮助别人。
我有一个解决方案,但不适用于所有情况。
将图像保存到相机胶卷的问题是,将图像添加到相机胶卷时会创建一个 assetURL。此外,该资源 URL 每次都是新的,因此如果您保存到相机胶卷,它将创建一个副本。图像的名称也不会保留。
如果图像首先通过您的应用程序添加到相机胶卷,那么您可以将 assetURL 存储为图像信息的一部分。
在我的应用程序中,为包含一些关键信息的每个图像维护一个字典。如果图像保存到相机胶卷,则这包括图像的 assetURL。
获得 URL 后,您可以使用以下命令检查其是否存在fetchAssetsWithALAssetURLs:options:
功能。
如果 URL 为 nil 或获取时的 asset 为 nil,则表示相机胶卷中不存在该图像。所以你可以重新添加。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)