ios - que - fotos iphone jpg
Cómo almacenar una imagen en datos básicos (5)
Soy nuevo en iOS. He intentado crear una aplicación que almacene una imagen capturada desde la cámara en CoreData
. Ahora sé cómo almacenar datos como NSString
s, NSDate
y otros tipos, pero NSDate
problemas para almacenar una imagen. He leído tantos artículos que dice que debe escribirlo en el disco y escribir en un archivo, pero parece que no puedo entenderlo.
El siguiente código es el que utilicé para almacenar otros datos en los datos centrales.
- (IBAction)submitReportButton:(id)sender
{
UrbanRangerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
managedObjectContext = [appDelegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PotholesDB" inManagedObjectContext:appDelegate.managedObjectContext];
NSManagedObject *newPothole = [[NSManagedObject alloc]initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];
[newPothole setValue:self.relevantBody.text forKey:@"relevantBody"];
[newPothole setValue:self.subjectReport.text forKey:@"subjectReport"];
[newPothole setValue:self.detailReport.text forKey:@"detailReport"];
// [newPothole setValue:self.imageView forKey:@"photo"];
NSDate *now = [NSDate date];
//NSLog(@"now : %@", now);
NSString *strDate = [[NSString alloc] initWithFormat:@"%@", now];
NSArray *arr = [strDate componentsSeparatedByString:@" "];
NSString *str;
str = [arr objectAtIndex:0];
NSLog(@"now : %@", str);
[newPothole setValue:now forKey:@"photoDate"];
[newPothole setValue:self.latitudeLabel.text forKey:@"latitude"];
[newPothole setValue:self.longitudeLabel.text forKey:@"longitude"];
[newPothole setValue:self.addressLabel.text forKey:@"streetName"];
[newPothole setValue:streeNameLocation forKey:@"location"];
NSError *error;
[managedObjectContext save:&error];
UIAlertView *ll = [[UIAlertView alloc] initWithTitle:@"Saving" message:@"Saved data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[ll show];
}
En la subclase xcdatamodelId, declarar entidad de imagen como NSData
... no puede usar el formato UIImage
porque los datos de imagen están en formato binario.
@property (nonatomic, retain) NSData *imag;
En el archivo de Implementación ... convertir UIImage
a NSData
UIImage *sampleimage = [UIImage imageNamed:@"sampleImage.jpg"];
NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 0.0);
Entonces finalmente guárdalo
[obj setValue:dataImage forKey:@"imageEntity"]; // obj refers to NSManagedObject
No sé por qué quiere almacenar imágenes en los datos centrales, mientras que hay otro almacenamiento persistente disponible en iOS. Si solo desea almacenar imágenes para fines de caché, puede almacenarlas en el directorio de documentos o en el directorio de caché. Feliz codificación ...
Consulte a continuación la URL, Cómo almacenar y recuperar imágenes en el directorio de documentos.
http://www.wmdeveloper.com/2010/09/save-and-load-uiimage-in-documents.html
Guardar imagen en el directorio de Documentos y recuperar datos adjuntos de correo electrónico
Pocos enlaces que puedan ayudarlo a superar este problema
https://.com/a/3909082/558000
Puede almacenar imágenes en Core Data utilizando el tipo de atributo Datos binarios. Sin embargo, debes tener en cuenta algunas cosas:
Siempre convierta su UIImage a un formato de datos portátil como png o jpg Por ejemplo:
NSData *imageData = UIImagePNGRepresentation(image);
Habilita "Permitir almacenamiento externo" en este atributo Core Data moverá los datos a un archivo externo si alcanza un cierto umbral. Este archivo también está completamente administrado por Core Data, por lo que no tiene que preocuparse por ello.
Si se encuentra con problemas de rendimiento, intente mover el atributo Datos Binarios a una entidad separada.
Debe abstraer la conversión a NSData detrás de la interfaz de su subclase NSManagedObject, para que no tenga que preocuparse por las conversiones de UIImage a NSData o viceversa.
Si sus imágenes no están estrechamente relacionadas con las entidades de su modelo, le sugiero que las guarde fuera de Core Data.
- (void)imageChanged:(UIImage*)image{
if (self.detailItem) {
[self.detailItem setValue:UIImagePNGRepresentation(image) forKey:kSignatureImage];
}
}
En este un breve ejemplo. self
es un controlador de vista que utiliza datos centrales y self.detailItem es el NSManagedObject habitual. En ese proyecto, no creé clases modelo para las entidades, sino que uso estrictamente el patrón KVC para acceder a los atributos. Como se puede adivinar, el atributo se llama "signatureImage"
que yo había definido en una constante #define kSignatureImage
.
Aquí es donde se restaura la imagen a partir de los datos centrales:
self.signatureCanvas.image = [UIImage imageWithData:[self.detailItem valueForKey:kSignatureImage]];
De nuevo, self
es un controlador de vista, signatureCanvas
es una subclase .image
e .image
es su propiedad de image
regular heredada de UIImageView
. detailItem
, nuevamente, es el NSManagedObject
habitual.
El ejemplo está tomado de un proyecto en el que estoy trabajando actualmente.
Existen ventajas y desventajas para almacenar objetos de datos de gran tamaño, como imágenes en datos básicos, o separarlos en archivos. Almacenarlos en archivos significa que usted es responsable de eliminarlos cuando se eliminan los objetos de datos relacionados. Eso proporciona una sobrecarga de codificación y puede ser volátil para errores de programación. Por otro lado, puede ralentizar la base de datos subyacente. Todavía no tengo suficiente experiencia con este enfoque que pueda compartir con respecto al rendimiento. Al final, el espacio ocupado en el disco ocupa aproximadamente el mismo tamaño en total.