iOS:问题保存照片

Posted

技术标签:

【中文标题】iOS:问题保存照片【英文标题】:iOS: Issue Saving Photo 【发布时间】:2012-03-30 21:52:04 【问题描述】:

我是 Objective-C 的新手,遇到了一些初学者问题。我有一个应用程序,它的区域应该有点像照片库。用户从他们的相机胶卷中选择一张照片,照片就会显示在 UIImageViews 中。我正在尝试保存他们选择的图像。我有 9 个 UIImageView,问题是当我为每个 UIImageView 选择不同的照片,关闭并重新启动应用程序时,其他 8 个 UIImageViews 显示存储在第一个图像视图中的照片。这是我正在使用的代码:

- (NSString *)dataFilePath 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename9];


- (void)applicationDidEnterBackground:(UIApplication*)application 
    NSLog(@"Image on didenterbackground: %@", imageView);
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView2.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView3.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView4.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView5.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView6.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView7.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView8.image)];
    self.imageData = [NSData dataWithData:UIImagePNGRepresentation(imageView9.image)];

    [self.imageData writeToFile:[self dataFilePath] atomically:YES];
    NSLog(@"The image is: %@", [[imageView image] description]);
    NSLog(@"dataFilePath is: %@", [self dataFilePath]);



- (void)viewDidLoad


    NSString *filePath = [self dataFilePath];
    NSLog(@"FilePath: %@", filePath);
    NSLog(@"Image: %@", imageView);
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
        NSData *vdlData = [[NSData alloc] initWithContentsOfFile:filePath];
        imageView.image = [[UIImage alloc] initWithData:vdlData];
        imageView2.image = [[UIImage alloc] initWithData:vdlData];
        imageView3.image = [[UIImage alloc] initWithData:vdlData];
        imageView4.image = [[UIImage alloc] initWithData:vdlData];
        imageView5.image = [[UIImage alloc] initWithData:vdlData];
        imageView6.image = [[UIImage alloc] initWithData:vdlData];
        imageView7.image = [[UIImage alloc] initWithData:vdlData];
        imageView8.image = [[UIImage alloc] initWithData:vdlData];
        imageView9.image = [[UIImage alloc] initWithData:vdlData];
    


    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:app];

    [super viewDidLoad];


我试图弄清楚我需要更改什么来让 UIImageViews 显示正确的图片,而不是它们都显示相同的图片。这可能是一个简单的修复,但任何帮助将不胜感激,谢谢!

【问题讨论】:

您是否注意到您正在分配每个 imageView 与存储在 vdlData 中的相同图像......并且您将每个图像存储到同一个变量(相互覆盖),然后再将其保存到一个路径(数据文件路径)? 哦,哇,我怎么错过了。谢谢你。将所有变量保存到一个路径会很好,还是应该为每个变量设置不同的路径? 这里我把它变成一个答案。 【参考方案1】:

好的,我会这样做:

使用 NSUserDefaults 将图像保存为可变数组:

ViewController.h

@property(retain) NSUserDefaults *user;

ViewController.m

@synthesize user;

- (void)viewWillAppear:(BOOL)animated


    self.user = [NSUserDefaults standardUserDefaults];

编辑

    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
    while(array == nil)
    
       [self.user setObject:[NSMutableArray arrayWithObject:@""] forKey:@"images"]
       array = [[self.user objectForKey:@"images"]mutableCopy];
       NSLog(@"%@",@"attempting to create an array to store the images in");
    

结束编辑

- (void)applicationDidEnterBackground:(UIApplication*)application 
    NSLog(@"Image on didenterbackground: %@", imageView);
    NSMutableArray* array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]];

    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView5.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView6.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView7.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView8.image)];
    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView9.image)];

    [self.user setObject:array forKey:@"images"];



- (void)viewDidLoad

    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];

编辑

    if(array.count == 9)
    
    imageView.image = [[UIImage alloc] initWithData:[array objectAtIndex:0]];
    imageView2.image = [[UIImage alloc] initWithData:[array objectAtIndex:1]];
    imageView3.image = [[UIImage alloc] initWithData:[array objectAtIndex:2]];
    imageView4.image = [[UIImage alloc] initWithData:[array objectAtIndex:3]];
    imageView5.image = [[UIImage alloc] initWithData:[array objectAtIndex:4]];
    imageView6.image = [[UIImage alloc] initWithData:[array objectAtIndex:5]];
    imageView7.image = [[UIImage alloc] initWithData:[array objectAtIndex:6]];
    imageView8.image = [[UIImage alloc] initWithData:[array objectAtIndex:7]];
    imageView9.image = [[UIImage alloc] initWithData:[array objectAtIndex:8]];
    

结束编辑

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:app];

    [super viewDidLoad];



- (void)viewDidUnload

    self.user = nil;

这样,您不会丢失图像或数据,它们将被存储并轻松访问,即使您更新应用也不会消失。

干杯!

【讨论】:

没问题。我意识到前几天我帮助你解决了你的另一个问题。哈哈,小网站,虽然不是。 大声笑是的,伙计,你是救命稻草。我还有一个问题,我实现了您的代码,但由于某种原因它没有保存任何图像,我应该在任何地方添加返回吗?再次感谢伙计! 如果您不需要 png 表示,您可以将它们保存为 UIImages 数组...另外,添加我在编辑中添加的内容。【参考方案2】:

在我开始使用解决方案之前,我必须警告您,您执行此操作的方式不正确。我建议你从头开始学习 ios 开发。 Apple 自己的文档是一个很好的开始。 http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html

现在,回到你的问题。您在这里所做的只是保存一张图片,而不是全部 9 张。您始终为处理的每个图像设置self.imageData,并覆盖其先前的值,仅将最后一个图像保存到文件中。

因此,为了使您的代码正常工作,您必须为每个图像视图使用 imageData 对象,然后将该数据对象写入文件。

在您的情况下,最好使用循环来优化代码,而不是使用多个对象(如imageViewimageView2、...)。

另外,请确保您照顾好自己的记忆力。例如imageView.image 已分配但未释放。

【讨论】:

-1 请把第一段变成具体的建议或直接删除。也可以随意使用反引号来标记微型代码块以提高可读性。当你确定答案时,我可以反转负1。【参考方案3】:

嗯,我看到了两个问题。首先,在viewDidLoad 中,您所有的图像都在获取 initWithData:vdlData... 所以它们都获取相同的数据。这就是为什么它们都是一样的。

此外,当您尝试保存它们时,在...didEnterBackground 中,您会一遍又一遍地覆盖imageData 的值...当您保存它时,它只是您分配给的最后一个imageData。您可能想要创建一个NSArray,并将它们存储在其中,然后将它们从viewDidLoad 中的数组中拉出。

【讨论】:

以上是关于iOS:问题保存照片的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS 中保存新令牌照片

iOS 将照片保存在特定应用的相册中

将其他相机拍摄的 DNG(原始照片)保存到 iOS 照片库

如何在 iOS 中将照片保存在特定相册中

iOS - 从设备中获取所有照片并将它们保存到应用程序

IOS13:选择保存照片后未调用 UIActivityViewController.completionWithItemsHandler