objective c - para - Guardar una imagen en la carpeta de documentos de la aplicación desde UIView en iOS
gestor de archivos iphone 6 (4)
Tengo un UIImageView que permite a un usuario colocar y mantener una imagen hasta que se pueda guardar. El problema es que no puedo encontrar la manera de guardar y recuperar la imagen que coloqué en la vista.
Recuperé y coloqué la imagen en UIImageView así:
//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];
}
Muestra la imagen seleccionada en mi UIImageView muy bien, pero no tengo idea de cómo guardarla. Estoy guardando todas las otras partes de la vista (sobre todo UITextfield) en Core Data. He buscado y buscado, e intenté muchos bits de código que las personas sugirieron, pero o bien no estoy ingresando el código correctamente, o esas sugerencias no funcionan de la forma en que configuró mi código. Es probable que el primero. Me gustaría guardar la imagen en UIImageView usando la misma acción (un botón para guardar) que estoy usando para guardar el texto en los UITextFields. Así es como estoy guardando mi información UITextField:
// Handle Save Button
- (void)save {
// Get Info From UI
[self.referringObject setValue:self.myInfo.text forKey:@"myInfo"];
Como dije antes, he intentado varios métodos para hacer que esto funcione, pero no puedo entenderlo. Por primera vez en mi vida he querido causar daño físico a un objeto inanimado, pero he logrado contenerme.
Me gustaría poder guardar la imagen que el usuario coloca en el UIImageView en la carpeta de documentos de la aplicación, y luego poder recuperarla y colocarla en otro UIImageView para mostrar cuando el usuario inserta esa vista en la pila. ¡Cualquier ayuda es muy apreciada!
Versión de 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)
}
En 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
}
}
Está todo bien, hombre. No te hagas daño a ti ni a otros.
Probablemente no desee almacenar estas imágenes en Core Data, ya que eso puede afectar el rendimiento si el conjunto de datos crece demasiado. Mejor escribir las imágenes en los archivos.
NSData *pngData = UIImagePNGRepresentation(image);
Esto extrae los datos PNG de la imagen que ha capturado. Desde aquí, puedes escribirlo en un archivo:
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
Leerlo luego funciona de la misma manera. Construye el camino como acabamos de hacer arriba, luego:
NSData *pngData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:pngData];
Lo que probablemente querrá hacer es crear un método que cree cadenas de ruta para usted, ya que no desea que el código esté lleno en todas partes. Puede verse así:
- (NSString *)documentsPathForFileName:(NSString *)name
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
return [documentsPath stringByAppendingPathComponent:name];
}
Espero que sea útil.
Esta es la respuesta de Fangming Ning para Swift 3/4 , actualizada con un método recomendado y más Swifty para recuperar la ruta del directorio de documentos y con mejor documentación. Créditos a Fangming Ning para el nuevo método también.
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)
}
Consulte todas las posibles opciones de escritura de datos aquí.