Redimensionner une UIImage en étant Threadsafe

Il y a peu, je vous présentais ici même comment redimensionner une UIImage. Je vous replace dans le contexte: Dans certains cas, il peut être utile de redimensionner une UIImage. En effet, même si UIImageView gère très bien le redimensionnement, on peut vouloir exporter une image dans une certaine taille. De même, il n’est pas forcement utile de stocker (en mémoire ou bien en dur) une image de grande taille si c’est pour l’afficher réduite par la suite.

Le code qui était présenté est fonctionnel … Oui, mais un collègue m’a fait remarquer que ce n’était pas le cas en multi-threads. Pourquoi ? Tout simplement parce que quand on fait UIGraphicsBeginImageContext(), on travaille dans un contexte unique. Ainsi, quand on voudra redimensionner deux images en même temps, elles partageront le même contexte. Clairement, ça ne peut pas marcher. D’ailleurs: ça ne marche pas !

Partant de là il y a deux options: soit on gère un système de sémaphore, soit on trouve un moyen de créer un contexte spécifique. L’idée du sémaphore est à exclure d’emblée. Ceci pour la simple et bonne raison qu’elle nous enlève l’avantage principal d’utiliser des threads: pouvoir exécuter des opérations en simultané.

Il faut donc créer un contexte bitmap spécifique à notre thread. Ensuite, on dessine notre image à redimensionner dans ce contexte que l’on vient de créer. Pour finir, on n’oubliera pas de libérer les différents refs créées. Dans le code, voilà ce que cela donne:

Pour l’utilisation de CGBitmapContextCreate, référez vous à la littérature Apple sur le sujet. La seule chose qui aurait besoin d’être explicité c’est le premier paramètre: le NULL. Le premier paramètre correspond à un pointeur où les données du contexte doivent être stockées. Quand on passe NULL, on indique en fait que l’on se fiche d’où les données seront stockées (ce qui est notre cas).

Une fois l’addition de UIImage mise en place, l’utilisation du code est assez simple:

Merci à Loïc Dardant pour le code et le coup de main.

Submit a comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">