如何在ios中的nsuserdefaults中保存摄像头捕获图像

时间:2014-11-18 05:49:16

标签: ios iphone uiimage uiimagepickercontroller nsuserdefaults

我想在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];
}

3 个答案:

答案 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>]