2010-10-05 24 views
0

Dans mon jeu, je saisis une image de la photothèque de l'iPhone en utilisant le UIImagePickerController, qui renvoie un UIImage. Parce que l'image est une résolution énorme (1536x2048), cette UIImage prend près de 20mb en mémoire. Pour résoudre ce problème, je réduis l'image de manière significative avant de l'utiliser pour générer une image-objet, ce qui réduit l'empreinte mémoire. Cependant, il y a un court moment avant que l'image ne soit redimensionnée que mon utilisation de la mémoire augmente vraiment, et je crains que cela puisse causer des plantages dans des situations de mémoire insuffisante (bien que je ne reçoive pas d'avertissement de mémoire). Quelqu'un at-il des idées sur la façon de gérer ce scénario?UIImage de la photothèque très grande

Merci!

Répondre

0

Je peux confirmer exactement ce que vous dites: UIImagePicker est, pour un moment assez bref de sa vie, un énorme RAM. Tout ce que je peux vous dire, c'est d'effacer autant de mémoire que vous le pouvez. J'ai réussi à minimiser le crash en abandonnant toutes les autres images que j'ai en mémoire et en les rechargeant après avoir attrapé et redimensionné le UIImage I Je suis revenu du Picker.

La seule vraie solution que j'ai trouvé était de me procurer un iPhone 4. Il a assez de mémoire pour faire face. Ma pauvre vieille 3G était très facile à écraser avec UIImagePicker.

+0

obtenir un iPhone 4.gentil: D je pourrais avoir besoin de m'en procurer un. – Pavan

+0

Savez-vous si cela est en quelque sorte la faute de l'UIImagePicker lui-même ou si c'est directement en raison de la taille de l'image? –

+0

@stefan_g, C'est une fonction de l'image que UIImagePicker charge, mais il n'y a aucun moyen de l'empêcher de charger une image gigantesque s'il le souhaite. Tirer des images de l'appareil photo est une entreprise encombrante aussi ... La meilleure politique est de se faufiler autant que possible. –

1

Jetez un oeil à cela, il parle de redimensionner les images et ainsi de suite correctement:

https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more

Son un grand tutoriel sur FAQ sur UIImagePickerController, UIImage, mémoire et plus.

EDIT:

avertissements de mémoire sont extrêmement fréquentes lorsqu'ils traitent avec le UIImagePickerController. Cela est particulièrement vrai lors de l'utilisation de l'appareil photo. Gardez à l'esprit que si un fichier JPG ou PNG sur le disque ne peut contenir que quelques Mo, le bitmap mémoire non compressé utilisé pour dessiner l'image utilise considérablement plus.

Il n'y a rien que vous faites mal nécessairement, mais certaines améliorations peuvent être apportées:

Plutôt que de stocker les octets d'images dans Core Data, pourquoi ne pas écrire l'image sur le disque et stocker le chemin d'accès au fichier votre base de données? Si vous utilisez la libération automatique, plutôt que d'utiliser autant d'images auto-libérées, pouvez-vous trouver un moyen de gérer directement leur cycle de vie et de le libérer plus rapidement? La meilleure solution consiste peut-être à écrire les images sur disque le plus rapidement possible après le traitement et à libérer la mémoire qu'elles utilisent. Puis stocker leur emplacement en utilisant les données de base plutôt que les données brutes. Ou même supprimer toutes les images chargées, stocker sur le disque, charger une nouvelle image, puis stocker sur le disque, puis charger les images via le chemin.

quelque chose comme ca.

vous pouvez modifier un code comme ceci: Getting crash after picking images from UIImagePickerController (Related to memory leak?)

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

    [self dismissModalViewControllerAnimated:YES]; 

    if (object.imagePath != nil) { 
     [self deleteImages]; 
    } 
    dispatch_queue_t image_queue; 
    image_queue = dispatch_queue_create("com.gordonfontenot.app", NULL); 

    dispatch_async(image_queue, ^{ 

     NSDate *now = [NSDate date]; 

     NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
     [f setDateFormat:@"yyyyMMDDHHmmss"]; 

     NSString *imageName = [NSString stringWithFormat:@"Image-%@-%i", [f stringFromDate:now], arc4random() % 100]; 
     NSString *thumbName = [NSString stringWithFormat:@"%@-thumb", imageName]; 

     [f release]; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:imageName]; 
     NSString *thumbPath = [documentsDirectory stringByAppendingPathComponent:thumbName]; 

     NSData *thumbImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerEditedImage"] toSize:CGSizeMake(120, 120)]); 
     [thumbImageData writeToFile:thumbPath atomically:NO]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      object.thumbPath = thumbPath; 
      [self setupImageButton]; 
      imageButton.enabled = NO; 
      [self setupChooseImageButton]; 
     }); 
     NSData *fullImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"] toSize:CGSizeMake(800, 600)]); 
     [fullImageData writeToFile:fullPath atomically:NO]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      imageButton.enabled = YES; 
      object.imagePath = fullPath; 
     }); 

     if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { 
      UIImageWriteToSavedPhotosAlbum([info objectForKey:@"UIImagePickerControllerOriginalImage"], self, nil, nil); 
     } 

    }); 
    dispatch_release(image_queue); 
} 

Espérons que vous avez suffisamment d'informations pour aller d'ici.

PK

+0

Ouais c'est le tutoriel exact que j'ai pris mon code de redimensionnement. Il ne mentionne pas quoi faire sur le pic de mémoire si :( –

+0

C'est un bon tutoriel, mais il y a encore un moment où l'image qui revient est gigantesque et il n'y a rien à faire à ce sujet, mais déplacez les plats cassables du –

+0

ok ive mis à jour le post après avoir fait quelques recherches et en prenant quelques options à partir de différentes questions et trouvé quelque chose que vous pouvez faire pour l'instant puisque vous ne pouvez pas faire autre chose directement comme vous le souhaitez. – Pavan