iPhone使用唯一键加载和保存多个UIImages?

Posted

技术标签:

【中文标题】iPhone使用唯一键加载和保存多个UIImages?【英文标题】:iPhone Load and Save Multiple UIImages with Unique Key? 【发布时间】:2011-11-17 12:52:45 【问题描述】:

我知道有一些解决方案可以在 iPhone 上保存和加载图像。然而,没有一个对我有用。

例如,下面的链接有一个很棒的代码块,它可以让您加载和保存具有唯一键的 UIImage,但我不知道如何判断使用此代码加载图像时是否存在该键下的图像是否已经存在。

http://www.friendlydeveloper.com/2010/02/using-nsfilemanager-to-save-an-image-to-or-loadremove-an-image-from-documents-directory-coding/

//saving an image
- (void)saveImage:(UIImage*)image:(NSString*)imageName 
     NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
     NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
     NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path
     [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
     NSLog(@"image saved");


//removing an image
- (void)removeImage:(NSString*)fileName 
     NSFileManager *fileManager = [NSFileManager defaultManager];
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     NSString *documentsDirectory = [paths objectAtIndex:0];
     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", fileName]];
     [fileManager removeItemAtPath: fullPath error:NULL];
     NSLog(@"image removed");


//loading an image
- (UIImage*)loadImage:(NSString*)imageName 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     NSString *documentsDirectory = [paths objectAtIndex:0];
     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]];
     return [UIImage imageWithContentsOfFile:fullPath];

如果您能帮我解决这个问题,我们将不胜感激。我需要保存几张图片,并根据给定的密钥是否已经存在来加载它们。

【问题讨论】:

【参考方案1】:

如果您想获取具有唯一键的图像,请尝试使用 UUID。这将始终为您提供具有唯一键的图像。例如,这里是使用 UUID 的示例。

- (NSString *)pathForImageFileWithPrefix:(NSString *)Prefix

    CFUUIDRef   uuid;
    CFStringRef uuidStr;
    uuid = CFUUIDCreate(NULL);
    uuidStr = CFUUIDCreateString(NULL, uuid);
    NSData *imageData = UIImageJPEGRepresentation(chosenImage, 1.0);
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   
    NSString* documentsDirectory = [paths objectAtIndex:0]; 
    result = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%@.png",Prefix, uuidStr]];
    [imageData writeToFile:result atomically:NO];
    CFRelease(uuidStr);
    CFRelease(uuid);
    return result;

【讨论】:

【参考方案2】:

如果我的问题是正确的,您想知道具有给定图像名称的文件是否已经存在?然后你就可以使用

bool fileExists = [NSFileManager defaultManager] fileExistsAtPath:filePath];

【讨论】:

我在原始帖子的 loadImage 方法中完成了此操作。所以我有你的代码行和保存图像的文件路径,然后有一个if语句,所以如果fileExists它将返回那个保存的图像,否则它将返回nil。然而,布尔值似乎总是错误的,这意味着我总是得到零回报。关于如何调整 loadImage 方法来检查图像是否存在的任何想法? 你的文件路径是什么样的?你确定它是正确的,包括完整的目录路径、文件名和文件扩展名? 我 NSLogged 并得到了这个:/var/mobile/Applications/42C18ABE-18B2-41C5-9389-BC5C15BD8BD4/Documents/imgSaved.png 看起来不错,不是吗? 如果你的图片名称是 imgSaved.png,是的。不知道为什么在这种情况下你应该为 fileExists 得到 false ...

以上是关于iPhone使用唯一键加载和保存多个UIImages?的主要内容,如果未能解决你的问题,请参考以下文章

在后台加载 MKMapView 并从中创建 UIImage (iPhone & iPad)

无法从 iPhone 文档目录位置中的已保存文件重新加载 UIImage

iPhone保存的png在我加载回来后不一样了

从 iPhone 相机保存和裁剪 UIImage

iphone - 单个 UIImage 多个 UIImageView?

UIImage 在 iPhone 上保存带有文件名的图像