iphone - quedan - ¿Cómo guardo un UIImage en un archivo?
donde se guardan los archivos descargados de safari en iphone (8)
Si tengo un UIImage
de un imagePicker, ¿cómo puedo guardarlo en una subcarpeta en el directorio de documentos?
En Swift 3:
// Create path.
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let filePath = "/(paths[0])/MyImageName.png"
// Save image.
UIImagePNGRepresentation(image)?.writeToFile(filePath, atomically: true)
En Swift 4:
// Create path.
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let filePath = paths.first?.appendingPathComponent("MyImageName.png") {
// Save image.
do {
try UIImagePNGRepresentation(image)?.write(to: filePath, options: .atomic)
}
catch {
// Handle the error
}
}
Lo anterior es útil, pero no responde a su pregunta de cómo guardar en un subdirectorio u obtener la imagen de un UIImagePicker.
En primer lugar, debe especificar que su controlador implemente el delegado del selector de imágenes, en archivos de código .m o .h, como por ejemplo:
@interface CameraViewController () <UIImagePickerControllerDelegate>
@end
Luego implementa el método imagePickerController: didFinishPickingMediaWithInfo del delegado, que es donde puede obtener la fotografía del selector de imágenes y guardarla (por supuesto, puede tener otra clase / objeto que maneje el guardado, pero solo mostraré el código dentro del método):
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// get the captured image
UIImage *image = (UIImage *)info[UIImagePickerControllerOriginalImage];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *imageSubdirectory = [documentsDirectory stringByAppendingPathComponent:@"MySubfolderName"];
NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.png"];
// Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to PNG spec
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:filePath atomically:YES];
}
Si desea guardar como imagen JPEG, las últimas 3 líneas serían:
NSString *filePath = [imageSubdirectory stringByAppendingPathComponent:@"MyImageName.jpg"];
// Convert UIImage object into NSData (a wrapper for a stream of bytes) formatted according to JPG spec
NSData *imageData = UIImageJPEGRepresentation(image, 0.85f); // quality level 85%
[imageData writeToFile:filePath atomically:YES];
Por supuesto, puede crear subcarpetas en la carpeta de documentos de su aplicación. Utiliza NSFileManager
para hacer eso.
Utiliza UIImagePNGRepresentation
para convertir su imagen a NSData y guardarla en el disco.
// Create path.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];
// Save image.
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];
Core Data no tiene nada que ver con guardar imágenes en el disco por cierto.
Primero debe obtener el directorio de Documentos
/* create path to cache directory inside the application''s Documents directory */
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"fileName"];
Entonces debes guardar la foto en el archivo
NSData *photoData = UIImageJPEGRepresentation(photoImage, 1);
[photoData writeToFile:filePath atomically:YES];
Tienes que construir una representación de tu imagen como un formato particular (por ejemplo, JPEG o PNG), y luego llamar a writeToFile:atomically:
en la representación:
UIImage *image = ...;
NSString *path = ...;
[UIImageJPEGRepresentation(image, 1.0) writeToFile:path atomically:YES];
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:path atomically:YES];
donde ruta es el nombre del archivo en el que desea escribirlo.
extension UIImage {
/// Save PNG in the Documents directory
func save(_ name: String) {
let path: String = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let url = URL(fileURLWithPath: path).appendingPathComponent(name)
try! UIImagePNGRepresentation(self)?.write(to: url)
print("saved image at /(url)")
}
}
// Usage: Saves file in the Documents directory
image.save("climate_model_2017.png")