it-swarm.com.de

Wie man icns-Dateien manuell mit iconutil erstellt?

Wenn ich meine App validiere, erhalte ich folgende Fehlermeldung: 

das Anwendungspaket enthält kein Symbol im ICNS-Format, das sowohl ein 512x512- als auch ein [email protected]-Bild enthält.

Ich benutze die icns Icons mit Img2icns app und bis heute hat es immer richtig funktioniert. Aber jetzt bekomme ich diesen Fehler und es gibt keine Möglichkeit, damit es funktioniert. Ich habe versucht, zwei PNG-Dateien (512x512 und 1024x1024) in Img2icns zusammenzusetzen, aber ich bekomme immer diesen Fehler. Ich habe auch versucht, den Anweisungen in der OS X-Richtlinien für die Benutzeroberfläche von OS X zu folgen, aber wenn ich versuche, die Symbolsätze festzulegen, erhalte ich diesen Fehler:

-bash: Syntaxfehler in der Nähe von unerwartetem Token 'Zeilenumbruch'

Ich bin nicht sehr gut mit Terminalbefehlen, also mache ich vielleicht etwas falsch. Ich hab geschrieben:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

Wenn jemand helfen könnte, wäre das sehr dankbar. Danke, Massy.

90
Blue

Überprüfen Sie die folgenden Anweisungen ( link ):

Iconutil zum manuellen Erstellen einer icns-Datei verwenden 

Das Befehlszeilentool iconutil konvertiert iconset-Ordner in bereitstellungsfähige, hochauflösende icns-Dateien. (Eine vollständige Dokumentation für dieses Tool finden Sie, indem Sie man iconutil in Terminal eingeben.) Mit diesem Tool wird auch die resultierende icns-Datei komprimiert, sodass Sie keine zusätzliche Komprimierung durchführen müssen.

So konvertieren Sie einen Satz von Symbolen in eine icns-Datei

Geben Sie diesen Befehl in das Terminalfenster ein:

iconutil -c icns <iconset filename>

dabei ist <iconset filename> der Pfad zu dem Ordner, der den Satz von Symbolen enthält, die Sie in icns konvertieren möchten. Die Ausgabe wird an den gleichen Ort wie iconset file geschrieben, sofern Sie nicht eine Ausgabedatei wie angegeben angeben:

iconutil -c icns -o <icon filename> <iconset filename>

Mit anderen Worten, Sie müssen <iconset filename> durch den Pfad ersetzen:

/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset

Da der Pfad Leerzeichen enthält, müssen Sie doppelte Anführungszeichen verwenden. Beispiel:

iconutil -c icns "/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset"

Dieser Befehl sollte ordnungsgemäß funktionieren.

55
Anne

Hier ist ein Skript zum Konvertieren einer 1024x1024-Datei (mit dem Namen "Icon1024.png") in die erforderliche icns-Datei. Speichern Sie es in einem Feld namens "CreateICNS.src" in dem Ordner, in dem sich Ihre PNG-Datei befindet, dann im Terminal "cd" im selben Ordner und geben Sie "source CreateICNS.src" ein, um es aufzurufen:

mkdir MyIcon.iconset
sips -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 128 128   Icon1024.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/[email protected]
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset
236
Aidan

Es gibt ein Befehlszeilen-Knotenmodul, das die Konvertierung einer PNG-Datei in ein Iconset-Verzeichnis erledigt:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
17
Zeke

Diese Befehle (in Terminal eingegeben) funktionierten für mich beim Konvertieren einer alten icns-Datei in das neue Format:

cd Folder_With_Icns_File
iconutil -c iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil -c icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset

Aktualisieren

Der -c-Parameter für iconutil wird nicht mehr unterstützt. Verwenden Sie stattdessen --convert:

cd Folder_With_Icns_File
iconutil --convert iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil --convert icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset
12
Aidan

Die Verwendung aller Arten von Skripts zum Konvertieren von PNG-Bildern mit hoher Auflösung in ein Pleiad aus verschiedenen Kopien mit niedriger Auflösung mag praktisch sein (und ist es auch wirklich), man sollte jedoch nicht vergessen, dass diese Art der automatischen Größenanpassung spürbar unvollständige Bilder ergibt.

Je geringer die Auflösung, desto unschärfer das Symbol!

Stattdessen sollten Sie immer ein Logo in einem Vektorformat (z. B. in SVG) von Ihrem Designer anfordern. Mit diesem Handbuch können Sie manuell perfekte PNG-Dateien in allen erforderlichen Auflösungen vorbereiten und dann eine einzelne .icns-Datei erstellen, die Ihr App-Symbol auf jedem Bildschirm schön aussehen lässt, vom Mobiltelefon bis hin zu einem hochwertigen Retina-Display der letzter iMac.

Ab der neuesten Apple-Richtlinie ab 2016 sollten Sie die folgenden PNG-Dateien vorbereiten:

+---------------------+--------------------+--------------+
|      filename       | resolution, pixels | density, PPI |
+---------------------+--------------------+--------------+
| icon_16x16.png      | 16x16              |           72 |
| [email protected]   | 32x32              |          144 |
| icon_32x32.png      | 32x32              |           72 |
| [email protected]   | 64x64              |          144 |
| icon_128x128.png    | 128x128            |           72 |
| [email protected] | 256x256            |          144 |
| icon_256x256.png    | 256x256            |           72 |
| [email protected] | 512x512            |          144 |
| icon_512x512.png    | 512x512            |           72 |
| [email protected] | 1024x1024          |          144 |
+---------------------+--------------------+--------------+

Nachdem alle PNG-Dateien vorbereitet wurden, legen Sie sie in ein Verzeichnis mit der Erweiterung .iconset (beispielsweise Logos.iconset) und führen Sie sie vom Terminal aus aus:

iconutil --convert icns Logos.iconset

Wenn nach der Ausführung dieses Befehls keine Fehler aufgetreten sind, wurden alle Dateien ordnungsgemäß vorbereitet und die Datei Logos.icns befindet sich in demselben Verzeichnis. Sie enthält alle schönen Logos für Ihre App, die ab 2017 für jeden modernen Bildschirm geeignet sind.

9

Zusätzlicher Kommentar: Wenn Sie eine .icns-Datei erstellen, müssen Sie alle pic-Dateien mit dem Präfix "icon_ " umbenennen. Andernfalls schlägt iconutil mit der Fehlermeldung fehl: ".iconset: error: ICNS konnte nicht generiert werden." was überhaupt nicht informativ ist.

8
Bearsu

Ich habe ein bash-Skript geschrieben, um icns aus einer svg-Datei zu erstellen:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='[email protected]'
if [ ! -f "$largfile" ]; then
  convert -background none -resize 1024x1024 "$1" "$largfile"
fi
for s in "${sizes[@]}"; do
  echo $s
  convert -background none -resize ${s}x${s} "$largfile" "icon_${s}x$s.png"
done

cp 'icon_32x32.png'     '[email protected]'
mv 'icon_64x64.png'     '[email protected]'
cp 'icon_256x256.png'   '[email protected]'
cp 'icon_512x512.png'   '[email protected]'

mkdir icon.iconset
mv icon_*x*.png icon.iconset
iconutil -c icns icon.iconset

Vergewissern Sie sich, dass Sie imagemagick mit Librsvg-Unterstützung auf einem Mac installiert haben:

brew install imagemagick --with-librsvg

Dieses Skript hat mir recht gut gedient. 


Aktualisieren

Für eine gründlichere Behandlung habe ich ein Befehlszeilentool (in Swift geschrieben) zum Generieren von AppIcon.appiconset mit dem richtigen Layout und Format erstellt:

https://github.com/kindlychung/genicon

5
qed

Ich habe @ Henrys Skript überarbeitet, damit es besser aussieht:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

Update

Der -c-Parameter für iconutil wird nicht mehr unterstützt. Verwenden Sie stattdessen -—convert:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR
5
dardo82

Wenn ich meine App validiere, erhalte ich folgende Fehlermeldung:

das Anwendungspaket enthält kein Symbol im ICNS-Format, das sowohl ein 512x512- als auch ein 512x512 @ 2x-Bild enthält.

Ich bin nicht sehr gut mit Terminalbefehl und deshalb mache ich vielleicht etwas falsch. Ich hab geschrieben:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

Zum einen müssen Sie, wie ich in einem Kommentar zu Annes Antwort erwähnt habe, wahrscheinlich kein iconutil verwenden. Sie sollten in der Lage sein, das Iconset einfach zu Ihrem Projekt hinzuzufügen und Xcode als Teil des Builds für Sie konvertieren zu lassen.

So oder so kann dies Ihr Problem sein:

Ich habe versucht, zwei PNG-Dateien zusammenzustellen (512x512 und 1024x1024) ... aber ich bekomme immer den Fehler.

Es gibt keine 1024 x 1024 Punktgröße. Das Element mit 1024 mal 1024 Pixeln (das waren 1024 Punkte vor Mountain Lion) wird jetzt für 512 mal 512 Punkte @ 2x verwendet.

Ihre PNG-Datei muss entsprechend benannt werden: [email protected]

3
Peter Hosey

Apples ältere Icon Composer Version 2.2 funktioniert einwandfrei. Öffnen Sie einfach die .ICNS-Datei, drücken Sie die 1024x1024-Taste und fügen Sie Ihr Bild hinzu.

3
valexa

Tot einfach .png ???? .icns

  1. Download IconMaker.app Nur ein .applescript kann nicht beißen
  2. Ziehen Sie Ihr PNG auf die soeben erstellte IconMaker.app.

Weitere Informationen: http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

High Sierra Updateiconutil ist jetzt strenger bezüglich der Quellgröße .png. Mehr dazu im Blog-Post nach dem Klick. ✌️

3
eonist

@ dardo82's Shell-Code ist gut und funktioniert ... Hier ist ein einfacher in sh (für alle * nix's) und schneller (als ob es wirklich wichtig ist):

#!/bin/sh
#   This runs silent, be as verbose as you wish
NAME=$(basename ${1} .png)
DIR="${NAME}.iconset"
mkdir -p ${DIR}
for i in 16 32 128 256 512 ; do
    x=""
    for p in $i $(($i+$i)) ; do
        sips -z $p $p ${1} --out "${NAME}.iconset/icon_${i}x${i}${x}.png"
        x="@2x"
    done
done >/dev/null  # /dev/null in lieu of a "-s" silent option
iconutil -—convert icns $DIR
rm -r $DIR
2
MichaelT

iconutil -c icns Icon.iconset ausführen

Hinweis

  • Icon.iconset ist ein Ordner
  • Name beginnt mit Kleinbuchstaben icon_
  • Wenn Sie Icon.icns mit korrektem Bild sehen, wissen Sie, dass es funktioniert

 enter image description here

2
onmyway133

Es gibt zwei Aufgaben:
- 10 richtige icns-dateien erstellen
- Holen Sie sich Ihr Xcode-Projekt, um sie richtig zu verwenden 

Da ich mit diesen beiden Aufgaben stundenlang Probleme hatte und auch nicht mag, wenn ich nicht sehe, was los ist, hier ein Weg für die vorsichtigen: 

10 korrekte icns-Dateien erstellen:
Ich habe das obige Skript von Henry verwendet: Es funktioniert immer noch für HighSierra und Xcode 9.2, einschließlich des Befehls 'c'.
Die icns-Datei, die ich bekam, wurde nur als eine Symbolgröße in Finder/Quicklook angezeigt und in der Vorschau wurden nur 8 von 10 Größen angezeigt.
Also benutzte ich terminal, ging mit cd in meinen Ordner und benutzte den Befehl: iconutil -c iconet (icns Dateiname) für die soeben erstellte icns-Datei, um die icns-Datei wieder in einen iconset-Ordner zurückzusetzen, und Ich konnte meine neu erstellten 10 Symboldateien sehen. Durch den schnellen Blick auf den Iconset-Ordner (und den Vollbildmodus, um mit dem Schieberegler durchzublättern), konnte ich überprüfen, ob alle Größen wirklich sehr gut aussehen.

Nebenbei bemerkt: Sie sahen besser aus als meine Anpassungsversuche mit PSE, höchstwahrscheinlich, weil ich mir nicht die Zeit genommen habe, mit allen Anpassungsoptionen in PSE zu spielen. Wenn Sie PSE verwenden, stellen Sie sicher, dass Ihre PNG-Dateien ohne Farbprofil gespeichert werden. Wenn ich meine Unwissenheit gestehe, ist für mich eine 256x256 @ 2-Datei genauso wie eine 512x512-Datei - beide in 72dpi. Der Versuch, den obigen 144-dpi-Kommentaren zu folgen, hat für mich nicht funktioniert. 

Bringen Sie Ihr Xcode-Projekt zur korrekten Verwendung:
Zuerst löschte ich alle meine erfolglosen Versuche innerhalb von Xcode und verpflichtete eine saubere Version zum Git-Repository (was klüger gewesen wäre, wäre erst eine saubere Version gewesen - bevor ich den Icon-Zusatz odyssee verzweifelt gestartet hatte).
Ich habe auch sichergestellt, dass in der Datei info.plist kein Zeiger mit dem Eintrag 'icon file' verknüpft ist und dass ich in meinen allgemeinen Projekteinstellungen AppIcon für App Icons ausgewählt habe.
Dann habe ich einen Assets.asset-Katalog hinzugefügt und im Assets-Katalog einen neuen AppIcon-Ordner "AppIcons and Launch Images" für OS.
Dann kopierte ich jede png-Bilddatei (Drag & Drop mit gedrückter Option) aus dem Iconset-Ordner in den entsprechenden AppIcon-Platzhalter. So konnte ich wieder sehen, was passiert. Xcode hat das in icns-Dateien konvertiert, oder vielleicht - da mein Iconset-Ordner aus einem icns-Ordner stammt - wurden die Dateiformate akzeptiert. 

Dann archivieren und validieren. Beim Hochladen oder Validieren werden keine Fehler angezeigt. 

1
Uwe

Identisch mit @Henry (Kommentar oben), nimmt jedoch den PNG-Dateinamen als Argument an und gibt den ICNS mit demselben Namen aus.

HINWEIS: Es wird erwartet, dass der PNG-Dateiname nur einen Punkt für die separate Erweiterung hat, d. H. Xpto.png.

Speichern Sie also den folgenden Code in einem Feld namens "CreateICNS.src" in dem Ordner, in dem sich Ihre PNG-Datei befindet.

CODE:

IFS='.' read -ra ADDR <<< "$1"
ICONSET=${ADDR[0]}.iconset
mkdir $ICONSET
sips -z 16 16     $1 --out $ICONSET/icon_16x16.png
sips -z 32 32     $1 --out $ICONSET/[email protected]
sips -z 32 32     $1 --out $ICONSET/icon_32x32.png
sips -z 64 64     $1 --out $ICONSET/[email protected]
sips -z 128 128   $1 --out $ICONSET/icon_128x128.png
sips -z 256 256   $1 --out $ICONSET/[email protected]
sips -z 256 256   $1 --out $ICONSET/icon_256x256.png
sips -z 512 512   $1 --out $ICONSET/[email protected]
sips -z 512 512   $1 --out $ICONSET/icon_512x512.png
cp $1 $ICONSET/[email protected]
iconutil -c icns $ICONSET
rm -R $ICONSET

WIE BENUTZT MAN :

Dann im Terminal "cd" in den gleichen Ordner und geben Sie ein:

source CreateICNS.src {PNG filename}

dabei ist {PNG-Dateiname} der Name Ihrer PNG-Datei, d. h. xpto.png.

Wenn Ihre Datei abc.png heißen würde, würden Sie Folgendes verwenden:

source CreateICNS.src abc.png
1
Telmo Dias

Hier ist eine Funktion, die meistens aus dem Beispiel von Henry basiert (könnte in ~/.bash_profile nützlich sein):

mkicns() {
    if [[ -z "$*" ]] || [[ "${*##*.}" != "png" ]]; then
        echo "Input file invalid"
    else
        filename="${1%.*}"
        mkdir "$filename".iconset
        for i in 16 32 128 256 ; do
            n=$(( i * 2 ))
            sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png
            sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png
            (( i++ ))
        done
        cp "$1" "$filename".iconset/[email protected]
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

Verwendungszweck:

$ mkicns "filename.png"  # double-quote if spaces exist in filename

Erzeugt 10 Größen von 16x16 bis [email protected]; akzeptiert Eingabebilder in Nur .png Format.

0
l'L'l

Hallo, für meine Bedürfnisse habe ich ein Droplet erstellt, das nur durch Ziehen und Ablegen von Symbolen oder durch Suchen von Symbolen in einem Ordner funktioniert (ich beschränkte mich auf Ordner, da die Suche auf Volumes aller Symbole viel Zeit in Anspruch nehmen kann). In Drag & Drop können Sie Ordner oder Anwendungen ablegen, alles, was ein Symbol enthalten kann. Das erstellte Iconset trägt den Namen des Originalsymbols, es befindet sich in einem Verzeichnis "/ aaaicones" und dem Pfad des Symbols. Beispiel im Ordner "/ aaaicones" Wenn Sie xcode.app einreichen, finden Sie "/ Aaaicones/Applications/xcode.app/access.iconset" und /aaaicones/Applications/xcode.app/access.icns (das neu erstellte Symbol ) Es wird eine Textdatei vorhanden sein, in der der vollständige Pfad der Symbole und der Pfad zum entsprechenden Iconset-Beispiel nachverfolgt werden "/ Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn .framework/Versions/A/Resources/access.icns ""/aaaicones/Applications/xcode.app/access.iconset "Im Beispiel (xcode) kann am Ende ein Ordner (mit allen Symbolen und Wenn Sie ein Symbol alleine behandeln, wird es in das Verzeichnis "/ aaaicones/aIconeseule /" und seinen ursprünglichen Pfad, beispiel/aaaicones/aIconeseule/Mac Elcapitan/.VolumeIcon.icns, gesetzt und/aaaicones/aIconeseule/Mac Elcapitan /.VolumeIcon.iconset mit/aaaicones/aIconeseule/Mac Elcapitan/aalisticones.txt Das Droplet befindet sich unterhalb von

on open draggedItems
    set input to draggedItems
    set fich to draggedItems


    set media to {}

    set theInfo to {}

    set n to "0"
    repeat with currentItem in draggedItems
        set dirchoisi to POSIX path of fich
        if ".icns" is not in dirchoisi then
            if "Volumes" is not in dirchoisi then

                set origi to do Shell script "echo   /aaaicones" & dirchoisi
                set fich to do Shell script "echo " & fich & " | xxd -p -c 100000 | sed 's#3a#2f#g' | xxd -r -p | sed 's#" & dirchoisi & "#" & "/aaaicones" & dirchoisi & "#g' | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
                tell application "Finder"
                    if exists (folder fich) then
                        set nn to "0"
                        repeat with nn from 1 to 5
                            set origi to do Shell script "echo  " & origi & "/" & " | sed 's#//#" & nn & "/" & "#'"
                            set fich to do Shell script "echo " & fich & " | sed 's#:aaaicones*.*#" & origi & "#'" & " | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"

                            if not (exists folder (fich as Unicode text)) then
                                try
                                    set origi to do Shell script "echo  " & origi
                                    exit repeat
                                end try
                            end if
                        end repeat
                    end if
                end tell
                tell application "Finder"
                    if not (exists folder (fich as Unicode text)) then
                        do Shell script "mkdir -p -m 0777 " & quoted form of origi
                    end if
                end tell
                try
                    set theInfo to do Shell script "find " & (quoted form of dirchoisi) & " -name *.icns "
                end try




                set AppleScript's text item delimiters to return

                set theList to text items of theInfo

                set AppleScript's text item delimiters to ""

                set n to count theList
                repeat with i from 1 to n
                    if "Volumes" is not in item i of theList then
                        set end of media to item i of theList
                    end if
                end repeat
                set n to count media
                set cheminicns to do Shell script " > " & quoted form of (origi & "aalisticones.txt") & " |  chmod 777 " & quoted form of (origi & "aalisticones.txt")
                set cheminicns to do Shell script "ls " & quoted form of (origi & "aalisticones.txt")

                tell application "Finder"
                    set letext to (POSIX file cheminicns as alias)
                    set label index of letext to 2
                end tell



                repeat with i from 1 to n

                    set hdd to item i of media
                    try

                        set input to do Shell script "echo   " & hdd & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                        do Shell script "echo   " & quoted form of input & " >>" & quoted form of cheminicns
                        set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "

                        do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
                        set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
                        do Shell script "echo   " & quoted form of (origi & png) & " | sed 's#.icns#.iconset#' >>" & quoted form of cheminicns
                    end try
                end repeat
                tell application "Finder"
                    if exists (folder fich) then
                        open fich
                    end if
                end tell

            end if
        else

            set input to do Shell script "echo   " & dirchoisi & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
            set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "
            set origi to do Shell script "echo " & quoted form of ("/aaaicones/aIconeseule/" & input) & " | sed 's#/Volumes/##; s#" & quoted form of png & "##'"
            do Shell script "mkdir -p -m 0777 " & quoted form of origi
            do Shell script "echo   " & quoted form of input & " >>" & quoted form of origi & "aalisticones.txt"

            do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
            set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
            do Shell script "echo   " & quoted form of (origi & png) & " >>" & quoted form of origi & "aalisticones.txt"
        end if
    end repeat
end open
0
deek5

Ich brauchte das, aber für CMake. Ich wollte auch die Möglichkeit, ihm eine SVG zu geben.

Hier ist der Gist: https://Gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

Und der CMake-Code:

# LICENSE: CC0 - go nuts.

# Hi :) This is what I used to generate the ICNS for my game, Tide.
# Both input formats (SVG vs PNG) work just fine, but in my experience
# the SVG came out with noticeably better results (although PNG wasn't
# a catastrophe either). The logo for the game was simple enough that
# SVG was indeed an option.

# To use:
#
#    make_icns( INPUT "path/to/img.{svg,png}"
#               OUTPUT ICNS_PATH )
#
# Then add it as a custom target or use it as a
# dependency somewhere - I give you that option.
#
# For example:
#
#    add_custom_target( my-icns ALL DEPENDS "${ICNS_PATH}" )
#
# For the associated utilities:
#
# - PNG: brew install imagemagick
# - SVG: brew cask install inkscape
#
# Enjoy!

function (make_icns_from_png)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    find_program (
        convert_exe
        NAMES "convert" "convert.exe"
        DOC "Path to ImageMagick convert")
    if (NOT convert_exe)
        message (FATAL_ERROR "Could not find ImageMagick's 'convert' - is ImageMagick installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size}x${size}" "${ipath}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size2x}x${size2x}" "${ipath2x}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns_from_svg)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    set (CMAKE_FIND_APPBUNDLE NEVER) # otherwise, it'll pick up the app bundle and open a shit ton of windows
    find_program (
        inkscape_exe
        NAMES "inkscape" "inkscape.exe"
        DOC "Path to Inkscape"
        PATHS "/usr/local/bin" "/usr/bin")

    message (STATUS "Inkscape path: ${inkscape_exe}")

    if (NOT inkscape_exe)
        message (FATAL_ERROR "Could not find Inkscape - is it installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath}" -w ${size} -h ${size} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath2x}" -w ${size2x} -h ${size2x} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    if (NOT ARG_INPUT)
        message (FATAL_ERROR "INPUT is required")
    endif ()

    if (NOT IS_ABSOLUTE "${ARG_INPUT}")
        get_filename_component (ARG_INPUT "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    endif ()

    if (NOT EXISTS "${ARG_INPUT}")
        message (FATAL_ERROR "INPUT does not exist: ${ARG_INPUT}")
    endif ()

    file (RELATIVE_PATH ARG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}" "${ARG_INPUT}")

    get_filename_component (ARG_INPUT_EXT "${ARG_INPUT}" EXT)
    if ("${ARG_INPUT_EXT}" STREQUAL ".png")
        make_icns_from_png (INPUT "${ARG_INPUT}" OUTPUT child_output)
    elseif ("${ARG_INPUT_EXT}" STREQUAL ".svg")
        make_icns_from_svg (INPUT "${ARG_INPUT}" OUTPUT child_output)
    else ()
        message (FATAL_ERROR "INPUT must refer to a .png or .svg, but a ${ARG_INPUT_EXT} was provided")
    endif ()

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${child_output}" PARENT_SCOPE)
    endif ()
endfunction ()
0
Qix