iOS y Swift: ¿cómo puedo obtener y guardar un UIImage del usuario?
xcode6 camera-roll (5)
Estoy escribiendo una aplicación Swift para iOS. Quiero saber cómo obtener una imagen del rollo de la cámara del usuario (o lo que sea que estén llamando en estos días) y guardarlo localmente dentro de la aplicación para que pueda consultarlo más tarde. ¿Cómo podría uno hacer esto? Como ejemplo, digamos que quiero obtener la imagen y establecerla como la imagen para un UIImageView en mi guión gráfico.
Una vez que obtenga el objeto UIImage, puede guardar la imagen en un directorio de documento con el siguiente código
let imageData = NSData(data:UIImagePNGRepresentation(wineImage.image))
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var docs: String = paths[0] as! String
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png")
let result = imageData.writeToFile(fullPath, atomically: true)
Ray Wenderlich tiene un gran tutorial para usar un UIImagePickerController
para seleccionar una imagen y luego usar AssetsLibrary
para guardar en un álbum.
También hay información sobre el uso de filtros de imágenes que es más de lo que pediste en el tutorial.
Definitivamente debería usar un UIImagePickerController
como lo mencionó Brian, una vez que tenga la imagen seleccionada use este enfoque de administrador de archivos. No recomiendo usar NSUserDefaults
para almacenar imágenes, ya que va en contra de las directrices de Apple :
let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")
if !imageData.writeToFile(imagePath, atomically: false)
{
println("not saved")
} else {
println("saved")
NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}
Aquí está mi combinación.
Guardando Imagen:
let imageData = NSData(data:UIImagePNGRepresentation(pickedimage))
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var docs: String = paths[0] as! String
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png")
let result = imageData.writeToFile(fullPath, atomically: true)
print(fullPath)
Obtener la imagen:
let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
{
if paths.count > 0
{
if let dirPath = paths[0] as? String
{
let readPath = dirPath.stringByAppendingPathComponent("yourNameImg.png")
let image = UIImage(contentsOfFile: readPath)
UploadImagePreview.image = image
}
}
}
Podemos probar con Photos Framework para buscar la última imagen guardada.
var fetchOptions: PHFetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
var fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
if (fetchResult.firstObject != nil) {
var lastAsset: PHAsset = fetchResult.lastObject as! PHAsset
PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: self.UploadImagePreview.bounds.size, contentMode: PHImageContentMode.AspectFill, options: PHImageRequestOptions(), resultHandler: { (result, info) -> Void in
self.UploadImagePreview.image = result
})
}
Esto es exactamente lo que UIImagePickerController
combinado con NSUserDefaults
.
Para ti será una tarea en dos partes. Primero, deberá capturar la imagen con un UIImagePickerController
y luego almacenarla en su biblioteca de fotos o almacenarla en su dispositivo con NSUserDefaults
.
Para almacenar una imagen con NSUserDefaults
, vea esta pregunta .