2010-07-18 3 views
5

J'ai un UIImage et je voudrais mettre ses données dans un fichier et puis utilisé un fichier mappé pour économiser de la mémoire. Apparemment, les données UIImage sont privées et il n'est pas possible d'y accéder. Auriez-vous des suggestions pour résoudre ce problème?Carte mémoire UIImage

Merci!

Répondre

8

Si vous souhaitez mapper en mémoire les données d'image codées, puis mmap un fichier et fournir une référence aux données en passant un CGDataProviderRef à CGImageCreate.

mapped = mmap(NULL , length , ...); 
provider = CGDataProviderCreateWithData(mapped , mapped , length , munmap_wrapper); 
image = CGImageCreate(... , provider , ...); 
uiimage = [UIImage imageWithCGImage:image]; 
... 

Où munmap_wrapper est quelque chose comme ceci:

// conform to CGDataProviderReleaseDataCallback 
void munmap_wrapper(void *p , const void *cp , size_t l) { munmap(p , l); } 

Si vous voulez mémoire mapper les pixels réels, au lieu des données de sources codées, vous feriez quelque chose de similaire avec un CGBitmapContext. Vous devez également créer le fournisseur et l'image afin que l'image fasse référence aux mêmes pixels que le contexte. Tout ce qui est dessiné dans le contexte sera le contenu de l'image. La largeur, la hauteur, l'espace colorimétrique et les autres paramètres doivent être identiques pour le contexte et l'image.

context = CGBitmapContextCreate(mapped , ...); 

Dans ce cas, la longueur sera au moins bytes_per_row * hauteur octets de sorte que le fichier doit être au moins que les grandes.

Si vous avez une image existante et que vous souhaitez convertir les pixels, créez le contexte bitmap avec la taille et l'espace colorimétrique de votre image et utilisez CGContextDrawImage pour dessiner l'image dans le contexte.

Vous n'avez pas indiqué la source de votre image, mais si vous la créez au moment de l'exécution, il serait plus efficace de la créer directement dans le contexte bitmap. Toute création d'image nécessite un contexte bitmap en arrière-plan, il pourrait donc bien être la mémoire mappée depuis le début.

+0

Merci pour cette excellente réponse! Je vais regarder dans cela. Je ne suis pas vraiment familier avec la cartographie de la mémoire, mais je cherchais des moyens de réduire mon utilisation de la mémoire. Oui, j'ai accès à l'image bitmap car je manipule cette image bitmap puis la convertit en UIImage en utilisant CGDataProviderRef et CGImageCreate. Donc je suppose que je pourrais faire le mappage de la mémoire à ce stade en donnant une donnée mappée en mémoire à la CGDataProviderRef. – Kamchatka

+0

Vous pouvez essayer 'MAP_ANON' si vous ne vous souciez pas du fichier. Avec cela, vous pouvez traiter mmap presque comme malloc. – drawnonward

+0

Puis-je utiliser MAP_ANON sans spécifier de fichier? Si je fais un mmap puis que j'essaie de mémcpy les données avec la même taille que mmap, j'obtiens un EXC_BAD_ACCESS. – Kamchatka

Questions connexes