我想在nsuserdefaults中保存相机捕获图像。在集合视图中添加摄像头捕获图像。 (我在Cemeracaptureviewcontroler中添加了它)我的问题是:创建一个数组并添加捕获图像集合视图工作正常。但当我移回另一个视图控制器并再次返回Cemeracaptureviewcontroler时,则不会显示捕获图像。在数组值中,图像显示为null
。当图像保存意味着像这样的图像数组。
<UIImage: 0x7ae93f50> size {640, 424} orientation 0 scale 1.000000">
<UIImage: 0x7ae93f52> size {640, 424} orientation 0 scale 1.000000">
所以我认为将图像存储在用户默认值中并显示在集合中。我如何解决这个问题对我有帮助。
///这里我在拾取器中获取捕获图像
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;
[self presentViewController:imagePicker animated:YES completion:nil];
}
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:Nil];
originalImage = [info objectForKey:UIImagePickerControllerEditedImage];
recipeImageView.image = [originalImage fixOrientation];
[self.phto_arr_ addObject:originalImage];
[_collectionView reloadData];
}
答案 0 :(得分:2)
您可以将图像保存为NSUserDefults,
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
if(!self.phto_arr_){
self.phto_arr_ = [[NSMutableArray alloc] init];
}
[self.phto_arr_ addObject: chosenImage];
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.phto_arr_];
[[NSUserDefaults standardUserDefaults] setObject: encodedObject forKey:@"images"];
[[NSUserDefaults standardUserDefaults] synchronize];
[picker dismissViewControllerAnimated:YES completion:NULL];
}
并检索为,
- (void)viewWillAppear:(BOOL)animated {
NSUserDefaults *userDefaults = (NSUserDefaults *)[NSUserDefaults standardUserDefaults];
NSData *encodedObject = [userDefaults objectForKey:@"images"];
self.phto_arr_ = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
[_collectionView reloadData];
[super viewWillAppear:animated];
}
希望这可以帮到你
答案 1 :(得分:1)
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *browsed_Image = [UIImage imageWithData:UIImageJPEGRepresentation([info objectForKey:UIImagePickerControllerEditedImage], 0.2)];
[picker dismissViewControllerAnimated:YES completion:^{
if (browsed_Image) {
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(browsed_Image) forKey:@"keyname"];
});
}
}];
}
答案 2 :(得分:0)
不要使用默认值保存图像..
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image= [info objectForKey:UIImagePickerControllerEditedImage];
NSData *data = UIImagePNGRepresentation(image);
NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970];
NSNumber *timeStampObj = [NSNumber numberWithDouble:timeStamp];
NSString *fileName = nil;
fileName = [NSString stringWithFormat:@"PICT_%@.png", [timeStampObj stringValue]];
NSString *localFilePath = [dataPath stringByAppendingPathComponent:fileName];
[data writeToFile:localFilePath atomically:YES];
dispatch_async(dispatch_get_main_queue(), ^{
//if any UI task
});
});
}
datPath是dataPath = [documentsDirectory stringByAppendingPathComponent:@"<your relevent subdirectoryname>"];
现在将文件路径“localFilePath”保存在数组中并使用它,您可以通过保持其保留计数更高来维持其持久性,或者只是在NSUserDefaults
您可以将图片设置为
[UIImage imageWithContentsOfFile:<localFilePath>]