Salvar uma imagem para pasta de documentos do aplicativo de UIView no IOS

Eu tenho um UIImageView que permite ao usuário colocar e manter uma imagem até que ela possa ser salva. O problema é que não consigo descobrir como realmente salvar e recuperar a imagem que coloquei na exibição.

Eu recuperei e coloquei a imagem no UIImageView assim:

//Get Image - (void) getPicture:(id)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = (sender == myPic) ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; [self presentModalViewController:picker animated:YES]; [picker release]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage (UIImage *)image editingInfo:(NSDictionary *)editingInfo { myPic.image = image; [picker dismissModalViewControllerAnimated:YES]; } 

Ele exibe a imagem selecionada no meu UIImageView muito bem, mas não tenho idéia de como salvá-lo. Estou salvando todas as outras partes da visualização (principalmente UITextfield) no Core Data. Eu pesquisei e pesquisei, e tentei muitos trechos de código que as pessoas sugeriram, mas ou eu não estou inserindo o código corretamente, ou essas sugestões não funcionam com a configuração do meu código. É provável que seja o primeiro. Eu gostaria de salvar a imagem no UIImageView usando a mesma ação (um botão salvar) que estou usando para salvar o texto nos UITextFields. Aqui está como eu estou salvando minhas informações do UITextField:

 // Handle Save Button - (void)save { // Get Info From UI [self.referringObject setValue:self.myInfo.text forKey:@"myInfo"]; 

Como eu disse anteriormente, tentei vários methods para fazer isso funcionar, mas não consigo entender. Pela primeira vez na minha vida, eu quis causar danos físicos a um object inanimado, mas consegui me conter.

Eu gostaria de ser capaz de salvar a imagem que o usuário coloca no UIImageView na pasta de documentos do aplicativo e, em seguida, ser capaz de recuperá-lo e colocá-lo em outro UIImageView para exibição quando o usuário envia essa visão para a pilha. Qualquer ajuda é muito apreciada!

Está tudo bem, cara. Não se prejudique nem aos outros.

Você provavelmente não deseja armazenar essas imagens no Core Data, pois isso pode afetar o desempenho se o dataset ficar muito grande. Melhor gravar as imagens em arquivos.

 NSData *pngData = UIImagePNGRepresentation(image); 

Isso extrai dados PNG da imagem que você capturou. A partir daqui, você pode gravá-lo em um arquivo:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name [pngData writeToFile:filePath atomically:YES]; //Write the file 

A leitura depois funciona da mesma maneira. Construa o caminho como acabamos de fazer acima, então:

 NSData *pngData = [NSData dataWithContentsOfFile:filePath]; UIImage *image = [UIImage imageWithData:pngData]; 

O que você provavelmente desejará fazer é criar um método que crie strings de caminho para você, desde que você não queira que o código fique cheio em todo lugar. Pode parecer assim:

 - (NSString *)documentsPathForFileName:(NSString *)name { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [paths objectAtIndex:0]; return [documentsPath stringByAppendingPathComponent:name]; } 

Espero que seja útil.

Versão Swift 3.0

 let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString let img = UIImage(named: "1.jpg")!// Or use whatever way to get the UIImage object let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg"))// Change extension if you want to save as PNG do{ try UIImageJPEGRepresentation(img, 1.0)?.write(to: imgPath, options: .atomic)//Use UIImagePNGRepresentation if you want to save as PNG }catch let error{ print(error.localizedDescription) } 

Em Swift:

 let paths: [NSString?] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .LocalDomainMask, true) if let path = paths[0]?.stringByAppendingPathComponent(imageName) { do { try UIImagePNGRepresentation(image)?.writeToFile(path, options: .DataWritingAtomic) } catch { return } } 

Esta é a resposta da Fangming Ning para o Swift 3/4 , atualizada com um método recomendado e mais Swifty para recuperar o caminho do diretório de documentos e com melhor documentação. Créditos para Fangming Ning pelo novo método também.

 guard let documentDirectoryPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } //Using force unwrapping here because we're sure "1.jpg" exists. Remember, this is just an example. let img = UIImage(named: "1.jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("1.jpg").absoluteString) do { //Use UIImagePNGRepresentation if you want to save as PNG. //.atomic is just an example here, check out other writing options as well. (see the link under this example) //(atomic writes data to a temporary file first and sending that file to its final destination) try UIImageJPEGRepresentation(img, 1)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) } 

Confira todas as possíveis opções de gravação de dados aqui.

Swift 4 com extensão

 extension UIImage{ func saveImage(inDir:FileManager.SearchPathDirectory,name:String){ guard let documentDirectoryPath = FileManager.default.urls(for: inDir, in: .userDomainMask).first else { return } let img = UIImage(named: "\(name).jpg")! // Change extension if you want to save as PNG. let imgPath = URL(fileURLWithPath: documentDirectoryPath.appendingPathComponent("\(name).jpg").absoluteString) do { try UIImageJPEGRepresentation(img, 0.5)?.write(to: imgPath, options: .atomic) } catch { print(error.localizedDescription) } } } 

Exemplo de uso

  image.saveImage(inDir: .documentDirectory, name: "pic")