Qu’est-ce qu’un fichier ICNS ?
Un fichier ICNS est un conteneur Apple pour les ressources d’icônes d’applications. Il peut contenir plusieurs dimensions, résolutions et représentations en pixels des icônes utilisées par macOS.
Fonctionnement des fichiers ICNS
Un fichier ICNS regroupe les représentations d’une même icône macOS pour différentes tailles d’affichage et densités de pixels. Selon l’implémentation du lecteur de Pillow, le fichier commence par les quatre octets icns et une longueur totale en ordre gros-boutiste, suivis d’éléments commençant chacun par un code de type de quatre caractères et une longueur. Le code de type identifie la représentation : ic07 correspond par exemple à l’icône de 128 points, et ic10 à celle de 512 points à l’échelle 2x. Les outils d’Apple construisent le fichier à partir d’un dossier portant l’extension .iconset et contenant des PNG nommés selon leur taille en points et leur échelle. La commande iconutil convertit ce dossier en fichier ICNS et inversement, et les recommandations archivées d’Apple datant de 2012 indiquent que Xcode 4.4 convertit automatiquement un dossier iconset inclus dans un projet lors de la compilation de celui-ci. Le fichier Info.plist du paquet indique le nom du fichier d’icône au moyen de la clé CFBundleIconFile.
Points clés
- Quelles tailles faut-il inclure dans le fichier ? La convention iconset d’Apple utilise cinq tailles en points (16, 32, 128, 256 et 512), chacune à l’échelle standard et à l’échelle
@2x; la plus grande image mesure donc 1024 pixels sur 1024 pixels et porte le nomicon_512x512@2x.png. L’ensemble ne doit pas nécessairement être complet : les recommandations d’Apple indiquent que le système choisit la meilleure représentation pour les tailles que vous ne fournissez pas. Elles précisent également queicon_16x16@2x.pngeticon_32x32.pngne sont pas équivalents malgré leur nombre identique de pixels, car ils s’affichent à des tailles différentes à l’écran et peuvent nécessiter des niveaux de détail différents. Ces recommandations datent de 2012 et figurent dans les archives de la documentation d’Apple. - Que contient chaque élément ? Cela dépend du code de type ; un analyseur doit donc gérer plusieurs formes de charge utile. Dans le lecteur de Pillow, les éléments allant de
ic07àic14et deicp4àicp6contiennent chacun une image PNG ou JPEG 2000 complète, tandis que les anciens types tels queis32etil32contiennent des données RGB, brutes ou encodées par plages, avec le canal alpha dans un élément de masque distinct de 8 bits tel ques8mkoul8mk. Ce point compte pour les outils qui réutilisent un fichier ICNS comme source d’image : la documentation d’electron-builder indique qu’il extrait la plus grande image PNG intégrée lorsqu’un fichier ICNS sert de source d’icône pour une autre plateforme. Une personne a signalé qu’une compilation Linux s’était arrêtée avec le message « Could not extract a PNG frame from ICNS file » après le changement du convertisseur d’icônes de l’outil, et a contourné le problème en fournissant un PNG pour la compilation Linux. Ce signalement ne permet pas d’établir ce qui, dans ce fichier, a provoqué l’échec, et un responsable de maintenance a indiqué par la suite qu’une nouvelle version du convertisseur devrait le corriger. - Comment créer ou examiner un tel fichier ? Sur macOS,
iconutil -c icnsconvertit un dossier.iconseten fichier ICNS eticonutil -c iconsetreconvertit un fichier ICNS en ses PNG ; les recommandations d’Apple précisent que les images de l’iconset doivent être carrées, avec des dimensions correspondant à leurs noms de fichiers. En dehors de macOS, Pillow peut écrire des fichiers ICNS sur n’importe quel système d’exploitation depuis la version 8.3.0. Son module d’écriture redimensionne l’image que vous enregistrez en carré pour chaque taille que vous ne fournissez pas viaappend_images, et son code d’enregistrement ne vérifie ni que la source est carrée ni qu’elle mesure 1024 pixels de large. Il associe les images deappend_imagesselon leur largeur en pixels ; deux éléments ayant la même taille en pixels partagent donc une même image. Il écrit uniquement les éléments allant deic07àic14, d’une largeur comprise entre 32 et 1024 pixels : l’image de 32 pixels est stockée comme l’icône de 16 points à l’échelle 2x, et aucun élément n’est prévu pour l’icône de 16 points ou celle de 32 points à l’échelle standard. Apple recommande de concevoir d’abord la grande icône, puis de décider comment la réduire, en ajustant une icône si nécessaire selon sa taille et sa densité de pixels d’affichage.
Quand les fichiers ICNS sont utiles
Un fichier ICNS est utile lorsqu’un paquet d’application macOS est assemblé en dehors de la chaîne de traitement des ressources de Xcode, par exemple par un outil de conditionnement multiplateforme. Vous n’avez pas forcément à construire le fichier vous-même : la documentation d’electron-builder indique qu’il utilise tel quel un fichier .icns préconstruit et peut aussi convertir une source PNG ou SVG, en générant toutes les tailles à partir de cette seule entrée. Fournissez votre propre fichier lorsque votre outil l’exige ou lorsque vous souhaitez maîtriser le graphisme à chaque taille. Dans Xcode, la documentation actuelle d’Apple vous demande plutôt de fournir l’icône de l’application au moyen d’un catalogue de ressources ou d’un fichier Icon Composer. Les recommandations archivées d’Apple datant de 2012 indiquent qu’un ensemble complet de tailles est recommandé, mais pas obligatoire : macOS choisit la meilleure représentation disponible pour une taille que vous omettez, ce qui signifie que cette taille est affichée à partir d’un graphisme dessiné pour une autre.
Références
- Archives de la documentation d’Apple : optimisation pour la haute résolution (tailles d’iconset, iconutil, conversion par Xcode)
- Apple : clé CFBundleIconFile de la liste des propriétés d’information
- Apple : configurer l’icône de votre application avec un catalogue de ressources
- Apple : créer l’icône de votre application avec Icon Composer
- Code source de Pillow : IcnsImagePlugin.py (types d’éléments ICNS et charges utiles)
- Manuel de Pillow : lecture et enregistrement ICNS
- Documentation d’electron-builder (v26) : icônes et images (sources d’icônes acceptées, conversion ICNS)
- Ticket electron-builder 9876 : Could not extract a PNG frame from ICNS file