Come creare manualmente file icns usando iconutil?


106

Quando convalido la mia app ricevo questo errore:

il bundle dell'applicazione non contiene un'icona in formato ICNS, contenente sia un file 512x512 che 512x512@2xun'immagine.

Io uso per creare le icone icns con l' app Img2icns e fino ad oggi ha sempre funzionato correttamente. Ma ora ricevo quell'errore e non c'è modo di farlo funzionare. Ho provato a mettere insieme due file PNG ( 512x512e 1024x1024) in formato Img2icns ma ottengo sempre quell'errore . Ho anche provato a seguire le istruzioni in OS X Human Interface Guideline di Apple, ma quando provo a creare i set di icone ottengo questo errore del terminale:

-bash: errore di sintassi vicino al token imprevisto "nuova riga"

Non sono molto bravo con i comandi da terminale, quindi forse sto facendo qualcosa di sbagliato. Scrissi:

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

Se qualcuno potesse aiutare, sarebbe molto apprezzato. Grazie, Massy.


Ho creato un'app che avvolge iconutil per renderlo facile: hobbyistsoftware.com/icontool
Confused Vorlon

Risposte:


63

Controlla le seguenti istruzioni ( link ):

Usa iconutil per creare manualmente un file icns

Lo iconutilstrumento della riga di comando converte le iconsetcartelle in file icns ad alta risoluzione pronti per la distribuzione. (È possibile trovare la documentazione completa per questo strumento accedendo man iconutila Terminale.) L'utilizzo di questo strumento comprime anche il icnsfile risultante , quindi non è necessario eseguire una compressione aggiuntiva.

Per convertire un set di icone in un file icns

Immettere questo comando nella finestra del terminale:

iconutil -c icns <iconset filename>

dove <iconset filename>è il percorso della cartella contenente il set di icone in cui desideri convertire icns. L'output viene scritto nella stessa posizione di iconset file, a meno che non specifichi un file di output come mostrato:

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

In altre parole, devi sostituire <iconset filename>con il percorso:

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

Poiché il percorso contiene spazi, è necessario utilizzare virgolette doppie, ad esempio:

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

Questo comando dovrebbe funzionare correttamente.


2
Probabilmente non è necessario utilizzarlo iconutil, però. Puoi semplicemente aggiungere il set di icone al tuo progetto e lasciare che Xcode lo converta per te come parte della build. Questo è trattato nella sezione immediatamente precedente (molto breve): developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Peter Hosey

@Anne: tranne che il comando iconutil è incluso solo con le versioni del sistema operativo che non utilizzano file ICNS ... Nessun amore per noi che usiamo OS10.6.8 V1.1 ... è anche peggio "a modo nostro o in autostrada" per gli sviluppatori rispetto agli utenti.
Henrik Erlandsson

@Anne: ha funzionato ... grazie mille! (grazie anche per aver impostato correttamente la mia domanda). Peace, Massy
Blue

@HenrikErlandsson: tutte le versioni di Mac OS X utilizzano file .icns, fino alla 10.0.
Peter Hosey

10
Dovrebbero esistere i seguenti file: icon_16x16.png, icon_16x16@2x.png, icon_32x32.png, icon_32x32@2x.png, icon_128x128.png, icon_128x128@2x.png, icon_256x256.png, icon_256x256@2x.png. I file @ 2x dovrebbero essere memorizzati a 144 pixel per pollice, mentre gli altri dovrebbero essere memorizzati a 72 pixel per pollice.
carmin

284

Ecco uno script per convertire un png 1024x1024 (denominato "Icon1024.png") nel file icns richiesto. Salvalo in un file chiamato "CreateICNS.src" nella cartella in cui il tuo file png si trova quindi nel terminale "cd" nella stessa cartella e digita "source CreateICNS.src" per chiamarlo:

mkdir MyIcon.iconset
sips -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_16x16@2x.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64     Icon1024.png --out MyIcon.iconset/icon_32x32@2x.png
sips -z 128 128   Icon1024.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_128x128@2x.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_256x256@2x.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/icon_512x512@2x.png
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset

3
Superba. Ho messo Icon1024.png sul desktop, ho eseguito il codice e ha fatto tutto
Logic

2
È possibile che questo piccolo copione perfetto sia stato rotto a El Capitan? Ho aggiornato il mio Mac alla 10.11.3 e questo script ora restituisce "errore: formato immagine non supportato" quindi "/Users/IconScript/MyIcon-osx.iconset:error: la variante denominata" icona "non contiene risorse immagine". quindi "MyIcon-osx.iconset: errore: impossibile generare ICNS." Ho provato lo stesso script e il file .png su un Mac che non è aggiornato a El Capitan e ha funzionato lì come sempre ... = (
RanLearns

1
Sì @Henry, stavo solo rimuovendo i nomi delle cartelle per provare a rendere più pulito il commento, lo sto eseguendo nel Terminale dall'interno della cartella che contiene lo script e le icone src. L'unica cosa diversa da prima è El Capitan vs Yosemite ... Ho letteralmente usato lo script prima di aggiornare il sistema operativo con successo e poi subito dopo l'aggiornamento (nella stessa cartella, stessi comandi del terminale) e ora restituisce quell'errore. Hai avuto successo con esso su El Capitan?
RanLearns

3
Cose importanti da notare: i nomi dei file delle immagini delle icone devono iniziare con "icon_". Le immagini devono avere un canale alfa. Se necessario, puoi aggiungere un canale alfa con ImageMagick convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson

1
Oh mio Dio. costruire un'app elettronica e gestire le icone è stato un vero dolore. tutti i tutorial del blog puntano a utilità in linea obsolete. il tuo semplice script qui su stackerflow ha appena reso la mia giornata. grazie!
nelsonenzo

26

Sebbene l'utilizzo di tutti i tipi di script per convertire PNGun'immagine ad alta risoluzione in una miriade di diverse copie a bassa risoluzione possa sembrare utile (e lo è davvero), non bisogna dimenticare che questo tipo di ridimensionamento automatico renderà le immagini percettibilmente imperfette .

Minore è la risoluzione, più sfocata l'icona!

Voglio dire, io amo imagemagick , ma non è lo strumento giusto per questo compito!

Invece, dovresti sempre richiedere un logo in un formato vettoriale al tuo designer, ad esempio in SVG. Con questo a portata di mano, puoi preparare manualmente PNGfile perfetti in tutte le risoluzioni richieste e quindi crearne uno singolo.icns file, che renderà l'icona della tua app bellissima su ogni singolo schermo, da un iPhone SE economico a qualche display Retina di fascia alta degli ultimi iMac. Puoi utilizzare Photoshop, GIMP o qualsiasi altro strumento di tua scelta per generare questi PNG.

Dalle ultime linee guida sull'interfaccia umana di Apple del 2020, dovresti preparare i seguenti PNGfile:

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

Dopo che tutti i file PNG sono stati preparati, inseriscili in una directory con .iconsetestensione ( Logos.iconsetad esempio) ed esegui quanto segue da Terminal:

iconutil --convert icns Logos.iconset

Se non ci sono stati errori dopo aver eseguito questo comando, tutti i file sono stati elaborati correttamente e hai ottenuto il Logos.icnsfile nella stessa directory, contenente tutti i bellissimi loghi nitidi per la tua app che si adattano a qualsiasi schermo moderno.


16

C'è un modulo del nodo della riga di comando che fa tutto il lavoro di conversione di un file PNG in una directory del set di icone:

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

9
Non è più supportato. :(
jamescampbell

13

Questi comandi (inseriti nel Terminale) hanno funzionato per me per convertire un vecchio file icns nel nuovo formato:

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

Aggiornare

Il -cparametro per iconutil non è più supportato. Usa --convertinvece:

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

1
Grazie per aver mostrato questo, grazie a questo sono stato in grado di tornare indietro da icns per ottenere i png! :)
Noitidart

9

Commento aggiuntivo, quando crei un file .icns, devi rinominare tutti i file pic con il prefisso "icon_ ", altrimenti iconutil fallirà con il messaggio di errore: ".iconset: errore: Impossibile generare ICNS." che non è affatto informativo.


7

Come @Henry (commento sopra) ma prende come argomento il nome del file PNG e restituisce l'ICNS con lo stesso nome.

NOTA: il nome del file PNG dovrebbe avere solo 1 punto per separare l'estensione, cioè xpto.png.

Quindi, salva il codice seguente in un file chiamato "CreateICNS.src" nella cartella in cui si trova il tuo file png.

CODICE :

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/icon_16x16@2x.png
sips -z 32 32     $1 --out $ICONSET/icon_32x32.png
sips -z 64 64     $1 --out $ICONSET/icon_32x32@2x.png
sips -z 128 128   $1 --out $ICONSET/icon_128x128.png
sips -z 256 256   $1 --out $ICONSET/icon_128x128@2x.png
sips -z 256 256   $1 --out $ICONSET/icon_256x256.png
sips -z 512 512   $1 --out $ICONSET/icon_256x256@2x.png
sips -z 512 512   $1 --out $ICONSET/icon_512x512.png
cp $1 $ICONSET/icon_512x512@2x.png
iconutil -c icns $ICONSET
rm -R $ICONSET

COME USARE :

Quindi nel terminale, "cd" nella stessa cartella e digita:

source CreateICNS.src {PNG filename}

dove {nomefile PNG} è il nome del tuo file PNG, cioè xpto.png.

Se il tuo file si chiamasse abc.png dovresti usare:

source CreateICNS.src abc.png

Eccezionale! Morto semplice :) forse renderlo uno script .sh / lo renderebbe ancora di più :) Grazie!
Gutemberg Ribeiro

6

Ho scritto uno script bash per creare icns da un file svg:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='icon_512x512@2x.png'
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'     'icon_16x16@2x.png'
mv 'icon_64x64.png'     'icon_32x32@2x.png'
cp 'icon_256x256.png'   'icon_128x128@2x.png'
cp 'icon_512x512.png'   'icon_256x256@2x.png'

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

Assicurati di aver installato imagemagick con il supporto librsvg, su mac:

brew install imagemagick --with-librsvg

Questa sceneggiatura mi è servita abbastanza bene.


Aggiornare

Per un trattamento più approfondito, ho creato uno strumento a riga di comando (scritto in Swift) per generare AppIcon.appiconsetcon il layout e il formato corretti:

https://github.com/kindlychung/genicon


5

Ho riformattato lo script di @ Henry per farlo sembrare migliore:

#!/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

Aggiornare

Il -cparametro per iconutil non è più supportato. Usa -—convertinvece:

#!/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

4
La versione originale è semplice e si può riprodurre manualmente il processo in qualsiasi shell.
Denis Barmenkov

1
Se preferisci fare le cose manualmente, non hai affatto bisogno di un computer.
dardo82

5

Dead simple .png 👉 .icns

  1. Scarica IconMaker.app - È solo un .applescript che non morde
  2. Trascina e rilascia il tuo .png su IconMaker.app che hai appena creato.

Maggiori informazioni : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

L'aggiornamento di High Sierra iconutil è ora più rigoroso sulla dimensione .png del codice sorgente. Maggiori informazioni su questo nel post del blog dopo il salto. ✌️


3

Quando convalido la mia app ricevo questo errore:

il bundle dell'applicazione non contiene un'icona in formato ICNS, contenente sia un'immagine 512x512 che 512x512 @ 2x.

Non sono molto bravo con il comando da terminale e quindi forse sto facendo qualcosa di sbagliato. Scrissi:

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

Per prima cosa, come ho detto in un commento alla risposta di Anne, probabilmente non è necessario utilizzare iconutil. Dovresti essere in grado di aggiungere semplicemente il set di icone al tuo progetto e lasciare che Xcode lo converta per te come parte della build.

Ad ogni modo, questo potrebbe essere il tuo problema:

Ho provato a mettere insieme due file PNG (512x512 e 1024x1024)… ma ricevo sempre l'errore.

Non esiste una dimensione di 1024 per 1024 punti. L'elemento 1024 per 1024 pixel (che era 1024 punti prima di Mountain Lion) viene ora utilizzato per 512 per 512 punti @ 2x.

Il tuo file PNG deve essere denominato in modo appropriato: icon_512x512@2x.png


3

La versione 2.2 di Icon Composer di Apple funziona perfettamente, basta aprire il file .ICNS, premere il pulsante 1024x1024 e aggiungere la tua immagine.


non posso parlare per il richiedente originale, ma questa risposta è esattamente ciò di cui avevo bisogno. Grazie!
pestofago

3
I documenti Apple dicono "Nota: non utilizzare Icon Composer, non può creare file icns ad alta risoluzione.". Cioè, le icone @ 2x non possono essere fatte in questo modo.
Clay Bridges

Icon Composer sembra funzionare bene, viene spedito separatamente dal sito degli sviluppatori Apple come parte del pacchetto Strumenti grafici per Xcode. Vedi anche qui .
Michiel Kauw-A-Tjoe

2

Il codice della shell di @ dardo82 è buono e ha funzionato. Eccone uno più semplice in sh (per tutti i * nix) e più veloce (come se fosse davvero importante):

#!/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

Grazie per la variazione sul mio script, ora non sono nemmeno sicuro del motivo per cui ho usato zsh
dardo82

1

Ecco una funzione basata principalmente sull'esempio di Henry (potrebbe essere utile in ~/.bash_profile):

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/icon_512x512@2x.png
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

Utilizzo :

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

Crea 10 taglie da 16x16a 512x512@2x; accetta immagini di input .pngsolo in formato.


1

Correre iconutil -c icns Icon.iconset

Nota

  • Icon.iconset è una cartella
  • Il nome inizia in minuscolo icon_
  • Quando vedi Icon.icnscon l'immagine corretta, sai che funziona

inserisci qui la descrizione dell'immagine


Perché 3x? Apple non lo richiede.
Neurotrasmettitore

1

Ci sono 2 attività:
- crea 10 file icns corretti
- fai in modo che il tuo progetto Xcode li utilizzi correttamente

Dato che ho avuto problemi di un'ora con entrambe queste attività, e inoltre non mi piace quando non 'vedo' cosa sta succedendo, ecco un percorso per i cauti:

Crea 10 file icns corretti:
ho usato lo script precedente di Henry: funziona ancora per HighSierra e Xcode 9.2, incluso il comando "c".
Il file icns che ho ottenuto, è apparso come una sola dimensione dell'icona nel Finder / Quicklook e in Anteprima mostrava solo 8 delle 10 dimensioni.
Quindi ho usato il terminale, sono andato con cd nella mia cartella e ho usato il comando: iconutil -c iconset (nome file icns) sul file icns appena creato per ripristinare il file icns in una cartella di iconset, e - lo & behold - ho potuto vedere i miei 10 file di icone appena creati. Utilizzando Quick look sulla cartella del set di icone (e utilizzando la modalità a schermo intero per essere in grado di ingrandirle con il cursore), ho potuto verificare che tutte le dimensioni stiano effettivamente guardando molto bene.

Per inciso: sembravano migliori dei miei tentativi di ridimensionamento con PSE, molto probabilmente perché non mi sono preso il tempo di giocare con tutte le opzioni di ridimensionamento in PSE. Se usi PSE, assicurati che i tuoi file png siano salvati senza profilo colore. Inoltre, confessando la mia ignoranza, per me un file 256x256 @ 2 è lo stesso di un file 512x512, entrambi a 72 dpi. Il tentativo di seguire i commenti a 144 dpi sopra non ha funzionato per me.

Ottieni il tuo progetto Xcode per usarli correttamente: per
prima cosa ho cancellato tutti i miei tentativi infruttuosi all'interno di Xcode e ho inviato una versione pulita al repository git (quello che sarebbe stato intelligente, sarebbe stato eseguire prima una versione pulita - prima di avviare freneticamente l'icona aggiunta odyssee).
Mi sono anche assicurato che nel file info.plist non ci fosse alcun puntatore collegato alla voce 'file icona' e che nelle mie impostazioni generali del progetto avessi scelto AppIcon per App Icons.
Quindi ho aggiunto un catalogo assets.asset e all'interno del catalogo risorse una nuova cartella AppIcon 'AppIcons and Launch Images' per OS.
Quindi ho copiato (trascina e rilascia con l'opzione premuta) dalla cartella del set di icone ogni file di immagine png nel rispettivo Spaceholder di AppIcon. Quindi, di nuovo, ho potuto vedere cosa sta succedendo. Xcode lo ha convertito in file icns, o forse - poiché la mia cartella iconset deriva da una cartella icns - i formati di file sono stati accettati.

Quindi archivia e convalida e non ci saranno errori durante il caricamento o la convalida.


Formattazione! La tua risposta potrebbe essere buona, ma è illeggibile. Usa paragrafi e ritorni a capo.
Nic3500

0

Ne avevo bisogno, ma per CMake. Volevo anche l'opzione di dargli un SVG.

Ecco il succo: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

E il codice CMake:

# 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 ()

-1

Ciao, per le mie esigenze ho realizzato un droplet che funziona nel drag and drop delle sole icone oppure icone per cercare in una cartella (mi sono limitato alle cartelle in quanto le ricerche sui Volumi di tutte le icone possono richiedere molto tempo). Quindi in drag and drop puoi rilasciare cartelle o applicazioni, qualsiasi cosa che possa contenere un'icona. Il set di icone creato porta il nome dell'icona originale, è posizionato in una directory "/ aaaicones" e il percorso dell'icona. Esempio nella cartella "/ aaaicones se invii xcode.app troverai" /aaaicones/Applications/xcode.app/access.iconset "e /aaaicones/Applications/xcode.app/access.icns (l'icona ricreata) lì essere un file di testo in cui viene tracciato il percorso completo delle icone, E il percorso del set di icone corrispondente esempio "/Applications/xcode.app/Contents/Applications/Instruments.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.