Was ist eine ICNS-Datei?
Eine ICNS-Datei ist ein Apple-Container für Ressourcen von Anwendungssymbolen. Sie kann mehrere Symbolgrößen, Auflösungen und Pixeldarstellungen enthalten, die macOS verwendet.
So funktionieren ICNS-Dateien
Eine ICNS-Datei bündelt die Darstellungen eines macOS-Symbols für unterschiedliche Anzeigegrößen und Pixeldichten. In der Implementierung der Leseroutine von Pillow beginnt die Datei mit den vier Bytes icns und einer Gesamtlänge im Big-Endian-Format. Darauf folgen Elemente, die jeweils mit einem Typcode aus vier Zeichen und einer Längenangabe beginnen. Der Typcode kennzeichnet die Darstellung: ic07 steht beispielsweise für das Symbol mit 128 Punkt und ic10 für das Symbol mit 512 Punkt bei zweifacher Skalierung. Apples Werkzeuge erstellen die Datei aus einem Ordner mit der Erweiterung .iconset, der PNGs enthält, deren Namen Punktgröße und Skalierung angeben. Der Befehl iconutil konvertiert diesen Ordner in eine ICNS-Datei und zurück. Laut Apples archivierter Anleitung aus dem Jahr 2012 konvertiert Xcode 4.4 einen iconset-Ordner in einem Projekt automatisch beim Erstellen des Builds. Die Datei Info.plist des Bundles benennt die Symboldatei mithilfe des Schlüssels CFBundleIconFile.
Wichtige Fakten
- Welche Größen gehören in die Datei? Apples iconset-Konvention verwendet fünf Punktgrößen (16, 32, 128, 256 und 512), jeweils mit Standardskalierung und der Skalierung
@2x. Das größte Bild misst somit 1024 mal 1024 Pixel und heißticon_512x512@2x.png. Der Satz muss nicht vollständig sein: Laut Apples Anleitung wählt das System für Größen, die Sie nicht bereitstellen, die beste Darstellung aus. Dort steht auch, dassicon_16x16@2x.pngundicon_32x32.pngtrotz gleicher Pixelzahl nicht gleichwertig sind, da sie auf dem Bildschirm in unterschiedlichen Größen erscheinen und möglicherweise einen anderen Detailgrad benötigen. Diese Anleitung stammt aus dem Jahr 2012 und befindet sich in Apples Dokumentationsarchiv. - Was enthält jedes Element? Das hängt vom Typcode ab, daher muss ein Parser mehr als eine Nutzdatenform verarbeiten. In der Leseroutine von Pillow enthalten die Elemente von
ic07bisic14und vonicp4bisicp6jeweils ein vollständiges PNG- oder JPEG-2000-Bild. Ältere Typen wieis32undil32enthalten dagegen RGB-Daten, entweder roh oder lauflängencodiert, und den Alphakanal in einem separaten Maskenelement mit 8 Bit wies8mkoderl8mk. Das ist für Werkzeuge relevant, die eine ICNS-Datei als Bildquelle wiederverwenden: Laut der Dokumentation von electron-builder extrahiert das Werkzeug den größten eingebetteten PNG-Frame, wenn eine ICNS-Datei als Symbolquelle für eine andere Plattform dient. Eine Person berichtete von einem Linux-Build, der mit „Could not extract a PNG frame from ICNS file“ abbrach, nachdem das Werkzeug seinen Symbolkonverter gewechselt hatte. Als Umgehungslösung stellte sie ein PNG für den Linux-Build bereit. Aus dem Bericht geht nicht hervor, was in dieser Datei den Fehler verursachte. Eine Person aus dem Wartungsteam erklärte später, eine neue Version des Konverters sollte ihn beheben. - Wie erstelle oder untersuche ich eine solche Datei? Unter macOS konvertiert
iconutil -c icnseinen Ordner mit der Erweiterung.iconsetin eine ICNS-Datei, undiconutil -c iconsetkonvertiert eine ICNS-Datei zurück in ihre PNGs. Laut Apples Anleitung müssen die iconset-Bilder quadratisch sein und ihre Abmessungen den Dateinamen entsprechen. Außerhalb von macOS kann Pillow seit Version 8.3.0 auf jedem Betriebssystem ICNS-Dateien schreiben. Seine Schreibroutine skaliert das zu speichernde Bild für jede Größe, die Sie nicht mitappend_imagesübergeben, auf ein Quadrat. Der Speichercode prüft dabei nicht, ob die Quelle quadratisch oder 1024 Pixel breit ist. Er ordnet die Bilder inappend_imagesanhand der Pixelbreite zu, sodass zwei Elemente mit derselben Pixelgröße dasselbe Bild verwenden. Er schreibt nur die Elemente vonic07bisic14mit Breiten von 32 bis 1024 Pixel: Das Bild mit 32 Pixel wird als Symbol mit 16 Punkt bei zweifacher Skalierung gespeichert. Ein Element für das Symbol mit 16 Punkt oder 32 Punkt bei Standardskalierung fehlt. Apple empfiehlt, zuerst das große Symbol zu gestalten und dann zu entscheiden, wie es verkleinert werden soll. Dabei sollte das Symbol bei Bedarf an die Größe und Pixeldichte angepasst werden, in der es erscheint.
Wann ICNS-Dateien relevant sind
Eine ICNS-Datei ist relevant, wenn ein macOS-Anwendungsbundle außerhalb der Asset-Pipeline von Xcode zusammengestellt wird, etwa durch ein plattformübergreifendes Paketierungswerkzeug. Möglicherweise müssen Sie die Datei nicht selbst erstellen: Laut seiner Dokumentation verwendet electron-builder eine fertige Datei mit der Endung .icns unverändert und kann auch eine PNG- oder SVG-Quelle konvertieren, wobei jede Größe aus dieser einen Eingabe erzeugt wird. Stellen Sie eine eigene Datei bereit, wenn Ihr Werkzeug eine benötigt oder wenn Sie die Gestaltung für jede Größe selbst bestimmen möchten. Innerhalb von Xcode sieht Apples aktuelle Dokumentation stattdessen vor, das App-Symbol über einen Asset-Katalog oder eine Icon-Composer-Datei bereitzustellen. Laut Apples archivierter Anleitung aus dem Jahr 2012 ist ein vollständiger Größensatz empfohlen, aber nicht erforderlich: Für eine ausgelassene Größe wählt macOS die beste verfügbare Darstellung. Diese Größe wird somit mit einer Grafik angezeigt, die für eine andere Größe gezeichnet wurde.
Quellen
- Apple-Dokumentationsarchiv: Optimierung für hohe Auflösung (iconset-Größen, iconutil, Xcode-Konvertierung)
- Apple: Schlüssel CFBundleIconFile in der Information Property List
- Apple: App-Symbol mithilfe eines Asset-Katalogs konfigurieren
- Apple: App-Symbol mithilfe von Icon Composer erstellen
- Pillow-Quellcode: IcnsImagePlugin.py (ICNS-Elementtypen und Nutzdaten)
- Pillow-Handbuch: ICNS-Dateien lesen und speichern
- electron-builder-Dokumentation (v26): Symbole & Bilder (akzeptierte Symbolquellen, ICNS-Konvertierung)
- electron-builder-Issue 9876: Could not extract a PNG frame from ICNS file