Chargement d'une NSImage
GG
Membre
Bonjour à tous,<br />je suis en train de faire une application qui charge des images dans une NSMatrix.<br />Voilà la problématique :<br /><br />lorsque je charge de cette manière :<br />[code]<br /><br />image = [[NSimage alloc] initwithcontentoffile:filename];<br /><br />
et que je modifie la taille en mémoire de l'image, je remarque plusieurs choses :
- la mémoire est extremement sollicité
- et je passe beaucoup de temps (80% du temps total du chargement) à réduire la taille en mémoire de ces images.
Si je passe par :
<br /><br />image = [[NSImage alloc]initByReferencingFile:filename];<br /><br />
Les performances se dégradent de manière importante.
Existe t'il un moyen pour que la NSTiffrepresentation soit au chargement de la taille que l'on veut ?
En gros éviter de tout charger en mémoire et réduire ensuite cette taille.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le sujet a été plusieurs fois abordé déjà sur OC :
- si tu passes par un setSize, sache que ça ne redimentionne pas réellement l'image, il dit juste à quelle taille l'image est rendue mais ça ne modifie pas la taille qu'elle prend en mémoire
- Sinon y'a des codes qui trainent pour réellement redimentionner une image : via des NSAffineTransforms, ou via des codes comme a donné Bru ici
Selon la méthode que tu utilises pour faire ton redimentionnement, ça prendra pas les mêmes ressources (et la qualité finale ne sera pas forcément la même non plus).
Par contre je doute que tu puisses charger l'image directement à la taille que tu veux : lorsqu'on a une image sur le disque, la représentation binaire (le contenu du fichier quoi) qu'elle contient décrit chacun des pixels composant l'image. Donc quand tu ouvres l'image tu charges forcément les données représentant les pixels, à la taille où l'image a été enregistrée.
Donc tu es obligé de charger l'image, de la redimentionner, puis de relâcher la version grande taille pour libérer de la place et ne garder que la version redimentionnée...
Il faut lire un bout du fichier, travailler dessus, lire un autre bout etc.
On pourrait par exemple faire une mise à l'échelle 1/2 sur une image stockée au format JPEG, décoder chaque macrobloc 16x16 et ses voisins, faire la réduction du macrobloc (en tenant compte du voisinage donc pour les effets de continuité) pour obtenir un pseudo-macrobloc 4x4, puis passer au MB suivant... Et dropper les macroblocs qui ne sont plus utiles au fur et à mesure... déjà y'a du boulot pour un truc comme ça... et encore c'est que pour le JPEG. Après faut faire le même genre en PNG, en TIFF, et j'en passe...
Donc à mon avis c'est pas trop envisageable, ou alors faut vraiment en avoir l'utilité, genre un soft dédié à la manipulation d'images aux résolutions disproportionnées genre 9000x9000 ou pire
Mais je pense aussi aux gros formats comme les RAW etc.
pour ma part, la méthode suggérée par psychoh13, me semble la plus simple, maintenant j'ai lu que (mais je n'ai pas essayé, pas encore...) que CoreImage pouvait substituer avantageusement NSImage pour ce genre d'opération, car il est susceptible de faire travailler les GPU (cartes graphiques), etc...
Ceci dit dans le cas du post initial, (images dans une NSMatrix), je recommanderais de mettre en place une NSRelasePool,, de manière à libérer la mémoire après chaque conversion, c'est souvent là que cela coince, si on lance des resize en série, on risque de saturer la ram et de faire swapper le système ce qui ralentit fortement l'opération. J'ai déjà rencontré le cas et ca fait une grosse différence!
Denis