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
对象,然后将该数据对象写入文件。
在您的情况下,最好使用循环来优化代码,而不是使用多个对象(如imageView
、imageView2
、...)。
另外,请确保您照顾好自己的记忆力。例如imageView.image
已分配但未释放。
【讨论】:
-1 请把第一段变成具体的建议或直接删除。也可以随意使用反引号来标记微型代码块以提高可读性。当你确定答案时,我可以反转负1。【参考方案3】:嗯,我看到了两个问题。首先,在viewDidLoad
中,您所有的图像都在获取 initWithData:vdlData... 所以它们都获取相同的数据。这就是为什么它们都是一样的。
此外,当您尝试保存它们时,在...didEnterBackground
中,您会一遍又一遍地覆盖imageData
的值...当您保存它时,它只是您分配给的最后一个imageData
。您可能想要创建一个NSArray
,并将它们存储在其中,然后将它们从viewDidLoad
中的数组中拉出。
【讨论】:
以上是关于iOS:问题保存照片的主要内容,如果未能解决你的问题,请参考以下文章
IOS13:选择保存照片后未调用 UIActivityViewController.completionWithItemsHandler