2011-02-10 21 views
19

Tengo una aplicación para iPhone usando UIImagePickerController. Como sourceType tengoiPhone - UIImagePickerController -> guardar la imagen en la carpeta de la aplicación

  • UIImagePickerControllerSourceTypePhotoLibrary
  • UIImagePickerControllerSourceTypeCamera
  • UIImagePickerControllerSourceTypeSavedPhotosAlbum

por lo que el usuario puede hacer una foto o seleccione uno de la biblioteca de fotos de las fotos o las fotos de la cámara.

La imagen se mostrará en un UIImageView. La imagen debe guardarse si el usuario cierra la aplicación. Entonces, para campos de texto, uso NSUserDefaults. Lo sé, no es una buena manera de guardar la imagen dentro de los NSUSerDefaults con NSData, así que quiero guardar/copiar la imagen en una carpeta que es controlada por mi aplicación de manera similar a NSUserDefaults.

¿Cómo puedo hacer esto? Quiero guardarlo, y luego puedo escribir la ruta al archivo en mi NSUserDefaults y leerlo al inicio de la aplicación.

Gracias de antemano & Atentamente.

Respuesta

47

Usted puede utilizar el código siguiente en UIImagePickerControllerDelegate aplicación delegado

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

    //obtaining saving path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"]; 

    //extracting image from the picker and saving it 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    if ([mediaType isEqualToString:@"public.image"]){ 
     UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage]; 
     NSData *webData = UIImagePNGRepresentation(editedImage); 
     [webData writeToFile:imagePath atomically:YES]; 
    } 
} 

Eso es todos

+3

Tuve que usar [info objectForKey: UIImagePickerControllerOriginalImage]; en lugar de UIImagePickerControllerEditedImage –

+0

Exactamente, depende de que permita la edición o no, picker.allowsEditing = YES; – khunshan

+0

Esto supone que la imagen es un png (o al menos es irreverente sobre guardar la imagen como png). – Andy

8

Dependiendo del formato de archivo que desea guardar, puede utilizar

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES]; 

O

[UIImageJPEGRepresentation(image) writeToFile:path atomically:YES]; 
3

Este es el código para guardar el UIImage en el directorio del documento. Se puede utilizar este código en el método delegado didFinishPickingImage:

// Create paths to output images 
NSString *pngPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.png"]; 
NSString *jpgPath = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents/Test.jpg"]; 

// Write a UIImage to JPEG with minimum compression (best quality) 
// The value 'image' must be a UIImage object 
// The value '1.0' represents image compression quality as value from 0.0 to 1.0 
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES]; 

// Write image to PNG 
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; 

// Let's check to see if files were successfully written... 

// Create file manager 
NSError *error; 
NSFileManager *fileMgr = [NSFileManager defaultManager]; 

// Point to Document directory 
NSString *documentsDirectory = [NSHomeDirectory(); 
stringByAppendingPathComponent:@"Documents"]; 

// Write out the contents of home directory to console 
NSLog(@"Documents directory: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]); 

EDITAR

También puede utilizar:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

para encontrar el camino a su directorio documento de solicitud, en lugar de NSHomeDierctory. respuesta

+0

gracias! ¡funciona perfectamente! –

+0

@iHS tengo el requisito de recuperar imágenes de una API y almacenarla en la aplicación. ¿Puedo usar el mismo código para guardar imágenes? – arshad

1

actualización de knuku de Swift 3,0

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    //obtaining saving path 
    let fileManager = FileManager.default 
    let documentsPath = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first 
    let imagePath = documentsPath?.appendingPathComponent("image.jpg") 

    // extract image from the picker and save it 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     try! UIImageJPEGRepresentation(pickedImage, 0.0)?.write(to: imagePath!) 
    } 
    self.dismiss(animated: true, completion: nil)   
} 

aquí la imagen se guarda como JPEG, pero también puede guardarlo como PNG. el parámetro 0.0 representa la compresión y es la calidad más baja, si desea obtener el mejor uso 1.0.

Cuestiones relacionadas