2011-12-12 25 views
7

Estoy construyendo una aplicación en la que puedes hacer fotos o elegir una imagen del rollo de la cámara y guardarlas dentro de la aplicación para que se muestren en una vista de tabla y de detalles. El problema es que cuando hago una foto desde el interior de la aplicación y la guardo, la vista de tabla y la vista detallada se vuelven terriblemente lentas, como si la aplicación estuviera congelada. También recibo este error ": CGAffineTransformInvert: matriz singular.". Cuando cargo una imagen del rollo de la cámara que no se tomó desde el interior de mi aplicación, no hay ningún problema y la aplicación se ejecuta de manera muy suave.Problemas al cargar y guardar imágenes desde la cámara y el carrete de la cámara. ¿Qué estoy haciendo mal?

Este es el código para cuando abra la cámara y la cámara roll:

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{ 
if (buttonIndex == actionSheet.cancelButtonIndex) { 
    return; 
} 

UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.allowsEditing = NO; 

switch (buttonIndex) { 
    case 0: 
     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
      picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
     } 
     break; 
    case 1: 
     if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { 
      picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
     } 
     break; 
} 

[self presentModalViewController:picker animated:YES]; 
} 

Aquí es donde guardarlo en el rollo de la cámara y puse la imagen en una imageView:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
UIImage *mijnImage; 
if (CFStringCompare((__bridge_retained CFStringRef)mediaType, kUTTypeImage, 0)==kCFCompareEqualTo) { 
    mijnImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; 
    mijnPlaatje_.image = mijnImage; 
    UIImageWriteToSavedPhotosAlbum(mijnImage, nil, nil, nil); 

} 

[picker dismissModalViewControllerAnimated:YES]; 

}

Y aquí puedo guardar la imagen dentro de mi aplicación:

-(IBAction)save:(id)sender{ 
drankjes.plaatje = [mijnPlaatje_ image]; 
[self dismissModalViewControllerAnimated:YES]; 

}

¿Qué estoy haciendo mal?

Respuesta

0

Trate de añadir este delegado método para ver cuál es el error:

- (void)image:(UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { 
    NSLog(@"Saving image"); 
    if(error != nil) { 
     NSLog(@"Error saving: %@",[error localizedDescription]); 
    } 
} 
+0

tanques para su respuesta y agregué su código, pero parece que no hay un error real porque solo llega al primer NSLog. ¿Podría ser que las imágenes que estoy guardando sean demasiado grandes en términos de memoria? –

0

Para guardar probar esto en su método didFinishLaunchingWithOptions de aplicación:

NSString *path = [[NSBundle mainBundle]pathForResource:@"" ofType:@""]; 
UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(video:didFinishSavingWithError:contextInfo), nil); 
0

En primer lugar tratar de salvar su imagen hace clic desde cámara en algún lugar como NSData y luego acceda a la imagen en formato NSData, conviértala en UIImage y visualícela en el imageView.

Por ejemplo, puede usar directorio de documentos para crear un plist donde se puede guardar la imagen como NSData en el método -

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

}

Y cuando guardar la imagen en método que utilizó - - (IBAction) excepto: (id) {emisor }

puede acceder a la misma imagen desde el plist en el directorio del documento. Convierta el NSData como UIImage y visualícelo en imageView. Estoy seguro de que no habrá ningún error en ese momento.

Este error ": CGAffineTransformInvert: matriz singular". ocurre debido a la propiedad de orientación de la imagen de una imagen. Al guardar la imagen como NSData almacena la propiedad de la imagen. Y obtiene la imagen sin ningún error.

0

es necesario implementar algo

-(IBAction) pickphoto 
{ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) 
    { 
     UIImagePickerController *picker= [[UIImagePickerController alloc]init]; 
     picker.delegate = self; 
     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     [yourView presentModalViewController:picker animated:YES]; 
     picker.videoQuality = UIImagePickerControllerQualityTypeHigh; 
     picker.allowsEditing = NO; 
     [picker release]; 
    } 
} 


-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage : (UIImage *)image editingInfo:(NSDictionary *)editingInfo 
{ 
    [picker dismissModalViewControllerAnimated:YES]; 
    myImage.image=image; 
} 
1

Es necesario utilizar:

UIImageWriteToSavedPhotosAlbum(image, self, @selector(video:didFinishSavingWithError:contextInfo), nil) 

e implementar:

- (void)image:(UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { 
    NSLog(@"Saving image"); 
    if(error != nil) { 
     NSLog(@"Error saving: %@",[error localizedDescription]); 
    } 
} 

como dice Jensen2K, didFinishSavingWithError se llama, incluso si no hay error para que pueda usarlo para saber cuándo finalizó el guardado.

Cuestiones relacionadas