2010-08-09 7 views
3

Je voulais charger et afficher l'image (.jpg, .png) ayant une grande taille par ex. 1800x1200 ou 2000x1800 (largeur x hauteur). Si j'affiche de telles images de grande taille (1800x1200 ou 2000x1800) dans UIImageView, cela consomme aussi beaucoup de mémoire et l'application tombe en panne. Toujours selon la documentation d'Apple (http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html), nous devrions éviter de créer des objets UIImage dont la taille est supérieure à 1024 x 1024. Une solution consiste à redimensionner l'image. J'ai appliqué la logique pour redimensionner l'image en utilisant le code suivant.UIImage avec grande taille d'image - Problème de mémoire - Crash

UIGraphicsBeginImageContext(newSize); 
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Cela fonctionne bien et redimensionne l'image. Mais quand il charge une grande image dans un contexte de périphérique pour la redimensionner, il consomme beaucoup de mémoire pendant une seconde et à cause de cela l'application plante. Donc, cette approche ne fonctionne pas. S'il vous plaît partager si vous avez une meilleure approche pour redimensionner sans l'écraser.

également dans ce (http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html) lien, Apple a déclaré que

« Vous devriez éviter de créer des objets UIImage qui sont supérieures à 1024 x 1024 taille. En plus de la grande quantité de mémoire comme une image consommerait, vous risquez de rencontrer des problèmes lors de l'utilisation de l'image comme texture dans OpenGL ES ou lors du dessin de l'image dans une vue ou un calque.Cette restriction de taille ne s'applique pas si vous effectuez des manipulations basées sur le code 1024 pixels en le dessinant dans un contexte graphique bitmap-soutenu En fait, vous devrez peut-être redimensionner une image de cette manière (ou la diviser en plusieurs petites images) afin de la dessiner à l'un de vos points de vue. ".

Quelqu'un peut-il parler plus en détail "This size restriction does not apply if you are performing code-based manipulations, such as resizing an image larger than 1024 x 1024 pixels by drawing it to a bitmap-backed graphics context."? Comment dessiner l'image sur le contexte graphique bitmap-soutenu? Qu'est-ce que le contexte graphique bitmap? Cela m'aiderait si quelqu'un pouvait partager un exemple de code. Merci d'avance !!

Répondre

4

UIGraphicsBeginImageContext() crée un contexte graphique bitmap (sous le capot, il appelle CGBitmapContextCreate). La "restriction" se produit parce que les UIViews sont rendus en utilisant CALayers, et les CALayers sont rendus en tant que polys texturés sur le GPU, et le GPU a une taille de texture maximale (2044 pixels sur l'iPhone 2G/3G et probablement l'iPod Touchez 1G/2G). Ils l'ont augmenté sur les appareils 3GS et plus tard, vraisemblablement parce que les images de l'appareil photo sont plus grandes. Cela dit, vous devez pour pouvoir manipuler des images individuelles de la taille d'une caméra sans problème; un crash suggère que vous utilisez beaucoup de mémoire ailleurs (peut-être une fuite de mémoire?).

1

Vous devriez éviter d'avoir toute l'image en mémoire, même si c'est pour un court moment.

Je ne sais pas quelle est la source de votre image, mais peut-être que vous pourriez la stocker en morceaux (carreaux ou bandes). Pour afficher, chargez les bandes une par une et dessinez-les dans le même contexte d'image.

Si vous envisagez de zoomer, alors le CATiledLayer pourrait vous aider beaucoup. Regardez la vidéo de la session WWDC'10 sur les vues de défilement. C'est très éclairant.

Questions connexes