如何正确保存和读取图像?

Posted

技术标签:

【中文标题】如何正确保存和读取图像?【英文标题】:How to correctly save and read the image? 【发布时间】:2018-12-19 13:59:59 【问题描述】:

如何正确保存和读取图片?每次更新应用程序版本后,程序都想再次保存新图片。

保存图片:

+(void)setImage:(UIImage*)image 

NSData *imageData = UIImageJPEGRepresentation(image, 1);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *imagePath = [documentsPath stringByAppendingPathComponent:@"image.jpg"];

BOOL writtenToFile = [imageData writeToFile:imagePath atomically:YES];

[[NSUserDefaults standardUserDefaults] setObject:imagePath forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];

阅读图片:

+(UIImage*)getImage 
NSString *imagePath = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if (imagePath) 
    return [UIImage imageWithData:[NSData dataWithContentsOfFile:imagePath]];


return nil;

UserDefaults 中的 Set Object 始终为空。

【问题讨论】:

【参考方案1】:

不要保存用户默认的图像完整路径,因为它包含一个容器 GUID。 此容器 GUID 会在更新后发生变化。

- (void)setImage:(UIImage *)image 
    NSData *imageData = UIImageJPEGRepresentation(image, 1);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0];
    NSString *imagePath = [documentsPath stringByAppendingPathComponent:@"image.jpg"];

    BOOL writtenToFile = [imageData writeToFile:imagePath atomically:YES];

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];


+ (UIImage *)getImage 
    BOOL imageExists  = [[NSUserDefaults standardUserDefaults] boolForKey:key];
    if (imageExists) 
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsPath = [paths objectAtIndex:0];
        NSString *imagePath = [documentsPath stringByAppendingPathComponent:@"image.jpg"];

        return [UIImage imageWithData:[NSData dataWithContentsOfFile:imagePath]];
    

    return nil;

【讨论】:

为什么不使用NSUserDefaults boolForKey:来检查存储值呢? @rmaddy 完全正确,应该使用boolForKey: 另请注意,您有两个名为imagePath 的变量,其中一个根本不是路径。在 Objective-C 上是 BOOL,而不是 Bool

以上是关于如何正确保存和读取图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像保存和读取为文本,嵌入在代码中

opencv如何将lena.jpg的灰度值读取出来并在计算机上保存下来

获取 EXIF 方向标签,旋转到正确的方向,处理图像并以正确的方向保存图像

iOS:自定义相机如何始终以正确的方向保存图像?

退出并加载我的应用程序时,如何将图像保存并读取到临时文件夹

Tensorflow2 图像分类-Flowers数据深度学习模型保存读取参数查看和图像预测