Come creare manualmente i file icns usando iconutil?

Quando convalido la mia app ottengo questo errore:

il pacchetto di applicazioni non contiene un’icona nel formato ICNS, contenente sia un’immagine 512x512 sia un’immagine [email protected] .

Uso le icone icns con l’app Img2icns e fino a oggi funzionava sempre correttamente. Ma ora sto ricevendo quell’errore e non c’è modo di farlo funzionare. Ho provato a mettere insieme due file PNG ( 512x512 e 1024x1024 ) in Img2icns ma ottengo sempre 1024x1024 . Ho anche provato a seguire le istruzioni nella linea guida per l’interfaccia umana OS X di Apple, ma quando provo a creare i set di icone ottengo questo errore terminale:

-bash: errore di syntax vicino a un token imprevisto ‘newline’

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

 iconutil -c icns  

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

Leggi le seguenti istruzioni ( link ):

Usa iconutil per creare manualmente un file icns

Lo iconutil riga di comando iconutil converte le cartelle iconset in file icns pronti per l’implementazione e ad alta risoluzione. (Puoi trovare la documentazione completa per questo strumento inserendo man iconutil nel Terminale.) L’uso di questo strumento comprime anche il file icns 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

dove è il percorso della cartella contenente il set di icone che si desidera convertire in icns . L’output è scritto nella stessa posizione del iconset file , a meno che non si specifichi un file di output come mostrato:

iconutil -c icns -o

In altre parole, è necessario sostituire dal percorso:

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

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

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

Questo comando dovrebbe funzionare correttamente.

Ecco uno script per convertire un png 1024×1024 (denominato “Icon1024.png”) nel file icns richiesto. Salvalo in un file chiamato “CreateICNS.src” nella cartella in cui il tuo file png è quindi in “cd” terminale 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/[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 

C’è un modulo del nodo della riga di comando che fa tutto il lavoro necessario per convertire un file PNG in una directory iconset:

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

Questi comandi (inseriti in 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 parametro -c to iconutil non è più supportato. Usa --convert invece:

 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 

L’utilizzo di tutti i tipi di script per convertire immagini PNG ad alta risoluzione in una pleiade di diverse copie a bassa risoluzione può sembrare utile (ed è proprio così), non bisogna dimenticare che questo tipo di ridimensionamento automatico renderà le immagini percettibilmente imperfette.

Minore è la risoluzione, più sfoca l’icona!

Invece, dovresti sempre richiedere un logo in qualche formato vettoriale, ad esempio in SVG , dal tuo designer. Con questo, puoi preparare manualmente file PNG perfetti in tutte le risoluzioni richieste e quindi creare un singolo file .icns , che renderà l’icona della tua app bellissima su ogni singolo schermo, dal telefono cellulare a un display Retina di fascia alta di l’ultimo iMac.

Dalle ultime linee guida Apple del 2016, dovresti preparare i seguenti file PNG:

 +---------------------+--------------------+--------------+ | 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 | +---------------------+--------------------+--------------+ 

Dopo aver preparato tutti i file PNG, inseriscili in una directory con estensione Logos.iconset (ad esempio Logos.iconset ) ed esegui dal Terminale:

 iconutil --convert icns Logos.iconset 

Se non ci fossero errori dopo l’esecuzione di questo comando, tutti i file sono stati preparati correttamente e il file Logos.icns nella stessa directory, contenente tutti i bellissimi loghi Logos.icns per la tua app che si adatteranno a qualsiasi schermo moderno a partire dal 2017.

Commenti aggiuntivi, quando crei il file .icns, devi rinominare tutti i file pic con il prefisso “icona_ “, altrimenti, iconutil fallirà con il messaggio di errore: “. Icon: errore: imansible generare ICNS.” che non è affatto informativo.

Ho rifattorato la sceneggiatura di @ Henry per renderla migliore:

 #!/bin/zsh NAME=$(basename $1 .png); DIR="$NAME.iconset" mkdir -pv $DIR for mr 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 parametro -c to iconutil non è più supportato. Usa -—convert invece:

 #!/bin/zsh NAME=$(basename $1 .png); DIR="$NAME.iconset" mkdir -pv $DIR for mr 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 

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

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

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

 brew install imagemagick --with-librsvg 

Questo script mi ​​è servito abbastanza bene.


Aggiornare

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

https://github.com/kindlychung/genicon

Quando convalido la mia app ottengo questo errore:

il pacchetto di applicazioni non contiene un’icona nel formato ICNS, contenente sia un’immagine 512×512 sia un’immagine 512×512 @ 2x.

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

 iconutil -c icns  

Per prima cosa, come ho detto in un commento sulla risposta di Anne, probabilmente non hai bisogno di usare iconutil. Dovresti essere in grado di aggiungere 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 (512×512 e 1024×1024) … ma ottengo sempre l’errore.

Non c’è 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 x 512 punti @ 2x.

Il tuo file PNG deve essere nominato in modo appropriato: [email protected]

La versione 2.2 di Icon Composer più vecchia di Apple funziona perfettamente, basta aprire .ICNS al suo interno, premere il pulsante 1024×1024 e aggiungere l’immagine.

Dead simple .png 👉 .icns

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

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

L’aggiornamento di alta sierra iconutil ora è più rigido sulla dimensione .png di origine. Maggiori informazioni su questo nel post del blog dopo il salto. ✌️

Il codice shell di @ dardo82 è buono e funzionante. Ecco una più semplice in sh (per tutti * 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 

Esegui iconutil -c icns Icon.iconset

Nota

  • Icon.iconset è una cartella
  • Il nome inizia con l’ icon_ minuscolo
  • Quando vedi Icon.icns con l’immagine corretta, sai che funziona

inserisci la descrizione dell'immagine qui

Ciao, per le mie esigenze ho creato una gocciolina che funziona trascinando icone da solo o icone da cercare in una cartella (mi limito alle cartelle in quanto le ricerche su Volumi di tutte le icone possono richiedere molto tempo). Quindi, nel trascinamento della selezione è ansible rilasciare cartelle o applicazioni, qualsiasi cosa possa contenere un’icona. Il set di icone creato porta il nome dell’icona originale, si trova 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) ci sarà essere un file di testo in cui viene tracciato il percorso completo delle icone e il percorso dell’esempio di icone corrispondente “/Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn.framework/Versions/A /Resources/access.icns “” /aaaicones/Applications/xcode.app/access.iconset “nell’esempio preso (xcode) questo può creare una cartella alla fine (con tutte le icone e le icone) di 214 MB di dimensione. tratti un’icona da sola, verrà inserita nella directory “/ aaaicones / aIconeseule /” e il suo percorso originale, esempio / aaaicones / aIconeseule / Mac Elcapitan / .VolumeIcon.icns e / aaaicones / aIconeseule / Mac Elcapitan /.VolumeIcon. iconset con / aaaicones / aIconeseule / Mac Elcapitan / aalisticones.txt La goccia è sotto

 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 

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/[email protected] iconutil -c icns "$filename".iconset rm -r "$filename".iconset fi } 

Uso :

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

Crea 10 taglie da 16x16 a [email protected] ; accetta solo immagini di input in formato .png .

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

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

Quindi, salva il codice qui sotto 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/[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 

COME USARE :

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

 source CreateICNS.src {PNG filename} 

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

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

 source CreateICNS.src abc.png 

Ci sono 2 compiti:
– crea 10 file icns corretti
– fai in modo che il tuo progetto Xcode li usi correttamente

Poiché ho avuto lunghi problemi di un’ora con entrambi questi compiti, e inoltre non mi piace quando non vedo “cosa sta succedendo, qui un percorso per i prudenti:

Crea 10 file icns corretti:
Ho usato lo script di cui sopra da Henry: funziona ancora per HighSierra e Xcode 9.2, incluso il comando ‘c’.
Il file icns che ho ottenuto, è apparso come una sola icona in Finder / Quicklook e in Anteprima ha mostrato solo 8 di 10 dimensioni.
Così 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 iconset, e – lo & behold – potrei vedere i miei 10 file icona appena creati. Utilizzando Quick look sulla cartella iconset (e usando la modalità a schermo intero per essere in grado di ingrandirli con il cursore), potrei verificare che tutte le dimensioni stiano davvero guardando molto bene.

Per inciso: sembravano migliori dei miei tentativi di ridimensionamento con PSE, molto probabilmente perché non ho avuto il tempo di giocare con tutte le opzioni di ridimensionamento in PSE. Se usi PSE, assicurati che i tuoi file PNG vengano salvati senza il profilo colore. Inoltre, confessando la mia ignoranza, per me un file 256×256 @ 2 è lo stesso di un file 512×512 – entrambi in 72 dpi. Cercando di seguire i commenti di 144 dpi sopra non ha funzionato per me.

Ottieni il tuo progetto Xcode per usarli correttamente:
Per prima cosa ho cancellato tutti i miei infruttuosi tentativi all’interno di Xcode e ho effettuato una versione pulita del repository git (che sarebbe stato intelligente, sarebbe stato prima di eseguire una versione pulita – prima di avviare freneticamente l’aggiunta di icona odyssee).
Ho anche fatto in modo che nel file info.plist non ci fosse alcun puntatore collegato alla voce “file icona” e che nelle mie impostazioni generali del progetto avevo scelto AppIcon per le icone di app.
Poi ho aggiunto un catalogo assets.asset e all’interno del catalogo delle risorse una nuova cartella AppIcons e Launch Images per il sistema operativo.
Poi ho copiato (trascina e rilascia con l’opzione premuto) dalla cartella iconset ogni file di immagine png nel rispettivo AppIcon Spaceholder. Quindi, di nuovo, ho potuto vedere cosa sta succedendo. Xcode lo ha convertito in file icns, o forse – come la mia cartella iconset derivata da una cartella icns – i formati di file sono stati accettati.

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