2015-11-21 1 views
0

У меня есть код, с помощью которого я могу сделать снимок с камеры или из галереи телефона, Но я хочу сохранить изображение в что мне трудно. Я много читал об этом, и я не уверен с изображением в виде строковых или двоичных данных. И как его сохранить и как его получить.Сделайте снимок с камеры/галереи и сохраните его в основных данных

@property (strong) NSMutableArray *allPic; 
@property (strong) NSManagedObject *Image; 
@end 
@implementation ViewController 



-(NSManagedObjectContext *)managedObjectContext 
{ 
    NSManagedObjectContext *context = nil; 
    id delegate = [[UIApplication sharedApplication] delegate]; 
    if ([delegate performSelector:@selector(managedObjectContext)]) { 
     context = [delegate managedObjectContext]; 
    } 
    return context; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    // Fetch the devices from persistent data store 
    NSManagedObjectContext *managedObjectContext = [self  managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Picture"]; 
    self.allPic = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
} 


-(void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)takePic:(id)sender { 

    // ALERT SHEET. 
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 

    //CAMERA 
    UIAlertAction *openCamrea = [UIAlertAction actionWithTitle:@"צלם" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) 
    { 
     // If device has no camera. 
     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
     { 
      UIAlertController *alertNoCamera = [UIAlertController alertControllerWithTitle:@"Error" message:@"Device has no camera" preferredStyle:UIAlertControllerStyleAlert]; 
      UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action){}]; 
      [alertNoCamera addAction:ok]; 
      [self presentViewController:alertNoCamera animated:YES completion:nil]; 
     } 
     else// if have a camera. 
     { 
      UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
      picker.delegate = self; 
      picker.allowsEditing = YES; 
      picker.sourceType = UIImagePickerControllerSourceTypeCamera; 


      [self presentViewController:picker animated:YES completion:NULL]; 
     } 
    }]; 
    // GALLERY 
    UIAlertAction *openGallery = [UIAlertAction actionWithTitle:@"גלריה" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) 
    { 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.allowsEditing = YES; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 

     [self presentViewController:picker animated:YES completion:NULL]; 
    }]; 

    [alert addAction:openCamrea]; 
    [alert addAction:openGallery]; 
    [self presentViewController:alert animated:YES completion:nil]; 
} 

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    //save image 

{ 
+0

Что вам нужно сделать, это сохранить URL-адрес изображения в ваших основных данных, и если вы снимаете изображение и не храните его в своей галерее, сохраните изображение в своем DocumentDirectory и сохраните его путь в формате url в основных данных. Поскольку сохранение изображения в основных данных не является допустимым решением, так как оно увеличит размер db, поэтому вам просто нужно сохранить путь изображения. Если вы выбираете изображение из галереи, вам просто нужно сохранить его путь, а не образ в DocumentDirectory, поскольку он уже присутствует в вашей галерее. –

+0

Вы использовали ранее в DocumentDirectory, но когда я удалил изображение из альбома, он не был удален из приложения, и мне стало сложно .. – mimpami

+0

Кроме того, я не мог использовать массив изображений в DocumentDirectory – mimpami

ответ

0

Я думаю, что правильным способом будет сохранение файла в каталоге и сохранение пути к CoreData. Вот как я достиг этого:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
     [self.view makeToast:@"Saving Captured Image!" duration:2.0f position:@"top"]; 
     UIImage *image = info[UIImagePickerControllerOriginalImage]; 
     [self performSelectorInBackground:@selector(saveImage:) withObject:image]; 
    } 
} 

- (void) saveImage : (UIImage *) image { 
    // image detail 
    // NSData *data = UIImagePNGRepresentation(image); 
    NSData *data = UIImageJPEGRepresentation(image, 1.0f); 
    NSString *imagePath = [self pathForMedia:MediaTypeImage name:[self getImageName:data]]; 

    //WRITE FILE 
    BOOL saved = [data writeToFile:imagePath atomically:YES]; 
    if (!saved) 
     return; 

    //Now save: `imagePath` to core Data. 
} 

- (NSString *) getImageName : (NSData *) imageData { 
    return [NSString stringWithFormat:@"%@.%@",[self getUniqueId], [self contentTypeForImageData:imageData]]; 
} 

- (NSString *) pathForMedia : (MediaType) type name : (NSString *) name{ 
    NSString *foldername = [NSString stringWithFormat:@"/%@/%@", ((type == MediaTypeImage) ? @"Photos" : @"Videos"), name]; 
    return [[self getUserDocumentDir] stringByAppendingPathComponent:foldername]; 
} 


- (NSString *)contentTypeForImageData:(NSData *)data { 
    uint8_t c; 
    [data getBytes:&c length:1]; 

    switch (c) { 
     case 0xFF: 
      return @"jpg"; 
     case 0x89: 
      return @"png"; 
     case 0x47: 
      return @"gif"; 
     case 0x49: 
      break; 
     case 0x42: 
      return @"bmp"; 
     case 0x4D: 
      return @"tiff"; 
    } 
    return nil; 
} 


- (NSString *) getUniqueId { 
    CFUUIDRef unqiueId = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, unqiueId); 
    CFRelease(unqiueId);  
    return [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""]; 
} 
+0

Не работает для меня, я не совсем понимаю код слишком много. Мне нужно добавить – mimpami

0

сохранить изображение на основных данных:

Вы можете сохранять изображения в основных данных с использованием типа атрибута двоичных данных. Однако вы должны знать несколько вещей:

Всегда конвертировать UIImage в портативном формате данных, например, PNG или JPG Например:

NSData *imageData = UIImagePNGRepresentation(image); 

Enable «Позволяет внешнее запоминающее устройство» на этот атрибут

enter image description here

Основные данные будут перемещать данные во внешний файл, если он достигнет определенного порогового значения. Этот файл также полностью управляется Core Data, поэтому вам не нужно беспокоиться об этом.

Если у вас возникли проблемы с производительностью, попробуйте переместить атрибут Binary Data в отдельный объект.

Вы должны абстрагировать преобразование в NSData позади интерфейса вашего NSManagedObject подкласса, так что вам не придется беспокоиться о конверсии от UIImageNSData до или наоборот.

Если ваши изображения не сильно связаны с объектами в вашей модели, я бы предложил хранить их вне Core Data.

для получения изображений из галереи или камер:

{ 

    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 

     UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                   message:@"Device has no camera" 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles: nil]; 

     [myAlertView show]; 
     return; 

    } 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 

    //if you want to take image from gallery 

    //picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; 
    //picker.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum; 

    [self presentViewController:picker animated:YES completion:nil]; 
} 

Надеется, что это помогает.

+0

. Мне кажется, мне удалось сохранить изображение в основных данных, но как я могу его вернуть, я отправлю еще один вопрос, Спасибо! – mimpami

+0

Если ответ помог, отметьте его как принятый ответ и верните образы назад, вы можете обратиться http://stackoverflow.com/questions/3353172/save-and-retrieve-of-an-uiimage-on-coredata –

+0

Извините, что он сделал не помогите мне Я видел этот ответ здесь: Http://stackoverflow.com/questions/16685812/how-to-store-an-image-in-core-data – mimpami