2010-01-15 15 views
2

J'ai eu un gros problème de performance en utilisant UIImagePickerController et en sauvegardant l'image sur le disque. Je ne peux pas comprendre ce que je fais mal. Voici mon code:UIImagePickerController à court de mémoire avec la source de la caméra

- (void)imagePickerController:(UIImagePickerController *)pick 

didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
    iPixAppDelegate *delegate = (iPixAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [delegate addPicture:imageData];  
} 

La méthode addPicture crée un nouvel objet image qui est initialisé cette façon:

- (Picture*) initPicture:(NSData*)dat inFolder:(NSString*)pat { 
    self.data = dat; 
    NSDate *d = [NSDate date]; 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-mm-dd hh-mm-ss"]; 
    self.name = [[formatter stringFromDate:d] stringByAppendingString:@".png"]; //The name by default of a picture is the date it has been taken 
    [formatter release]; 
    self.path = [pat stringByAppendingPathComponent:self.name]; 
    if(![self fileExistsAtPath:self.path]){ 
     [self.data writeToFile:self.path atomically:YES]; 
    } 
    return self; 
} 

Le UIImagePickerController est assez rapide mais le programme devient très lent lorsque j'enregistre l'image sur la disque.

Une idée de ce que je fais mal?

Répondre

3

J'ai eu un problème similaire. La façon dont je me suis passé était de manipuler l'image du sélecteur dans un fil séparé. Mon problème était le thread principal traitant mon application/UI a été écrasant en essayant de fermer le sélecteur et gérer l'image:

- (void)imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingImage:(UIImage *)image 
       editingInfo:(NSDictionary *)editingInfo 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

    NSLog(@"picker did finish"); 
    [NSThread detachNewThreadSelector:@selector(useImage:) toTarget:self withObject:image]; 

} 
+0

cela m'aide tellement. Merci. Je pense que ce bogue se produit lorsque l'appareil est dans l'état 'near-be-full'. –

1

Votre problème est peut-être dû au fait que vous avez pris l'image originale. L'image originale de l'appareil photo a une résolution d'environ 1200x1400, ce qui représente beaucoup de mémoire et provoquera le blocage de l'appareil si vous essayez de créer une image (il manquera de mémoire).

Je suggère de redimensionner l'image pour être plus petit (le natif 320x480).

+1

Je ne pense pas que cela résoudra mon problème. Selon ce post, http://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more, une fois que les images sont écrites sur le disque, elles ne prennent pas beaucoup de mémoire. En tout cas merci pour votre réponse, je vais essayer. – rmonjo