Comment créer manuellement des fichiers icns à l'aide d'iconutil?

106

Lorsque je valide mon application, j'obtiens cette erreur:

le bundle d'application ne contient pas d'icône au format ICNS, contenant à la fois un 512x512et une 512x512@2ximage.

J'utilise pour créer les icônes icns avec l' application Img2icns et jusqu'à aujourd'hui, cela fonctionnait toujours correctement. Mais maintenant, j'obtiens cette erreur et il n'y a aucun moyen de la faire fonctionner. J'ai essayé de mettre deux fichiers PNG ensemble ( 512x512et 1024x1024) dans Img2icns mais j'obtiens toujours cette erreur. J'ai également essayé de suivre les instructions du guide de l'interface humaine OS X d'Apple, mais lorsque j'essaie de créer les jeux d'icônes, j'obtiens cette erreur de terminal:

-bash: erreur de syntaxe près du jeton inattendu 'newline'

Je ne suis pas très bon avec les commandes de terminal, alors peut-être que je fais quelque chose de mal. J'ai écrit:

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

Si quelqu'un pouvait aider, ce serait très apprécié. Merci, Massy.

Bleu
la source
J'ai créé une application qui enveloppe iconutil pour rendre cela facile: hobbyistsoftware.com/icontool
Confused Vorlon

Réponses:

63

Consultez les instructions suivantes ( lien ):

Utilisez iconutil pour créer un fichier icns manuellement

L' iconutiloutil de ligne de commande convertit les iconsetdossiers en fichiers icns haute résolution prêts pour le déploiement. (Vous pouvez trouver une documentation complète pour cet outil en entrant man iconutildans Terminal.) L'utilisation de cet outil compresse également le icnsfichier résultant , vous n'avez donc pas besoin d'effectuer une compression supplémentaire.

Pour convertir un ensemble d'icônes en fichier icns

Entrez cette commande dans la fenêtre Terminal:

iconutil -c icns <iconset filename>

<iconset filename>est le chemin d'accès au dossier contenant l'ensemble d'icônes vers lequel vous souhaitez effectuer la conversion icns. La sortie est écrite au même emplacement que le iconset file, sauf si vous spécifiez un fichier de sortie comme indiqué:

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

En d'autres termes, vous devez remplacer <iconset filename>par le chemin:

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

Étant donné que le chemin contient des espaces, vous devez utiliser des guillemets doubles, par exemple:

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

Cette commande devrait fonctionner correctement.

Anne
la source
2
Vous n'avez probablement pas besoin de l'utiliser iconutil, cependant. Vous pouvez simplement ajouter l'ensemble d'icônes à votre projet et laisser Xcode le convertir pour vous dans le cadre de la construction. Cela est couvert dans la section immédiatement précédente (très courte): developer.apple.com/library/mac/documentation/GraphicsAnimation/...
Peter Hosey
@Anne: sauf que la commande iconutil n'est incluse qu'avec les versions d'OS qui n'utilisent pas de fichiers ICNS ... Pas d'amour pour nous qui utilisons OS10.6.8 V1.1 ... c'est encore pire `` notre chemin ou l'autoroute '' pour les développeurs que pour les utilisateurs.
Henrik Erlandsson
@Anne: Cela a fonctionné ... merci beaucoup! (merci aussi d'avoir posé ma question correctement). Peace, Massy
Blue
@HenrikErlandsson: Toutes les versions de Mac OS X utilisent des fichiers .icns, depuis la version 10.0.
Peter Hosey
10
Les fichiers suivants doivent exister: icon_16x16.png, [email protected], icon_32x32.png, [email protected], icon_128x128.png, [email protected], icon_256x256.png, [email protected]. Les fichiers @ 2x doivent être stockés à 144 pixels par pouce tandis que les autres doivent être stockés à 72 pixels par pouce.
carmin
284

Voici un script pour convertir un png 1024x1024 (nommé "Icon1024.png") en fichier icns requis. Enregistrez-le dans un fichier nommé "CreateICNS.src" dans le dossier où se trouve votre fichier png puis dans le terminal "cd" dans le même dossier et tapez "source CreateICNS.src" pour l'appeler:

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
Aidan
la source
3
Superbe. J'ai mis Icon1024.png sur le bureau, et exécutez simplement votre code et tout est fait
Logic
2
Est-il possible que ce petit script parfait ait été cassé à El Capitan? J'ai mis à niveau mon Mac vers 10.11.3 et ce script renvoie maintenant "erreur: format d'image non pris en charge" puis "/Users/IconScript/MyIcon-osx.iconset:error: la variante nommée 'icon' ne contient aucune ressource image." puis "MyIcon-osx.iconset: erreur: Impossible de générer ICNS." J'ai essayé le même script et le même fichier .png sur un Mac qui n'est pas mis à jour vers El Capitan et cela a fonctionné comme toujours ... = (
RanLearns
1
Ouais @Henry, je supprimais juste les noms de dossier pour essayer de nettoyer les commentaires, je l'exécute dans le terminal à partir du dossier qui contient le script et les icônes src. La seule chose différente qu'avant est El Capitan vs Yosemite ... J'ai littéralement utilisé le script avant de mettre à jour le système d'exploitation avec succès, puis juste après la mise à jour (dans le même dossier, les mêmes commandes du terminal) et il renvoie maintenant cette erreur. Avez-vous eu du succès avec El Capitan?
RanLearns le
3
Choses importantes à noter: les noms de fichiers de vos images d'icônes doivent commencer par "icon_". Les images doivent avoir un canal alpha. Vous pouvez ajouter un canal alpha avec ImageMagick si nécessaire convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson
1
OMG. créer une application d'électrons et gérer les icônes a été une telle douleur. tous les tutoriels du blog pointent vers des utilitaires en ligne obsolètes. votre simple script ici sur stackerflow vient de faire ma journée. Merci!
nelsonenzo
26

Bien que l'utilisation de toutes sortes de scripts pour convertir une PNGimage haute résolution en une pléiade de différentes copies basse résolution puisse sembler pratique (et c'est vraiment le cas), il ne faut pas oublier que ce type de redimensionnement automatique rendra des images visiblement imparfaites .

Moins de résolution - plus floue l'icône!

Je veux dire, j'aime imagemagickaussi, mais ce n'est pas le bon outil pour cette tâche!

Au lieu de cela, vous devriez toujours demander un logo dans un format vectoriel à votre concepteur, par exemple au format SVG. Avec cela, vous pouvez préparer manuellement des PNGfichiers parfaits dans toutes les résolutions requises, puis créer un seul.icns fichier, ce qui rendra l'icône de votre application magnifique sur chaque écran, d'un iPhone SE bon marché à un écran Retina haut de gamme du dernier. iMac. Vous pouvez utiliser Photoshop, GIMP ou tout autre outil de votre choix pour générer ces PNG.

À partir des dernières directives d'interface humaine d'Apple à partir de 2020, vous devez préparer les PNGfichiers suivants :

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

Une fois tous les fichiers PNG préparés, placez-les dans un répertoire avec une .iconsetextension ( Logos.iconsetpar exemple) et exécutez ce qui suit à partir de Terminal:

iconutil --convert icns Logos.iconset

S'il n'y avait pas d'erreur après l'exécution de cette commande, tous les fichiers ont été traités correctement et vous avez obtenu le Logos.icnsfichier dans le même répertoire, contenant tous les beaux logos nets pour votre application qui conviendront à n'importe quel écran moderne.

Neurotransmetteur
la source
16

Il existe un module de nœud de ligne de commande qui effectue tout le travail de conversion d'un fichier PNG en un répertoire d'icônes:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
Zeke
la source
9
N'est plus pris en charge. :(
jamescampbell
13

Ces commandes (entrées dans le terminal) ont fonctionné pour moi pour convertir un ancien fichier icns au nouveau 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

Mettre à jour

Le -cparamètre de iconutil n'est plus pris en charge. Utilisez à la --convertplace:

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
Aidan
la source
1
Merci d'avoir montré cela, grâce à cela, j'ai pu inverser les icns pour obtenir les png! :)
Noitidart
9

Commentaire supplémentaire, lorsque vous créez un fichier .icns, vous devez renommer tous les fichiers image avec le préfixe "icon_ ", sinon iconutil échouera avec le message d'erreur: ".iconset: erreur: Échec de la génération d'ICNS." ce qui n'est pas du tout informatif.

Bearsu
la source
7

Identique à @Henry (commentaire ci-dessus) mais prend comme argument le nom de fichier PNG et génère l'ICNS avec le même nom.

REMARQUE: Le nom du fichier PNG ne devrait avoir qu'un seul point pour séparer l'extension, c'est-à-dire xpto.png.

Donc, enregistrez le code ci-dessous dans un fichier appelé "CreateICNS.src" dans le dossier où se trouve votre fichier png.

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

COMMENT UTILISER :

Puis dans le terminal, "cd" dans le même dossier et tapez:

source CreateICNS.src {PNG filename}

où {PNG filename} est le nom de votre fichier PNG, c'est-à-dire xpto.png.

Si votre fichier s'appelait abc.png, vous utiliseriez:

source CreateICNS.src abc.png
Telmo Dias
la source
Impressionnant! Dead simple :) peut-être en faire un .sh / script le rendrait encore plus :) Merci!
Gutemberg Ribeiro
6

J'ai écrit un script bash pour créer des icns à partir d'un fichier 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

Assurez-vous que imagemagick est installé avec le support librsvg, sur mac:

brew install imagemagick --with-librsvg

Ce scénario m'a très bien servi.


Mettre à jour

Pour un traitement plus approfondi, j'ai créé un outil de ligne de commande (écrit en Swift) pour générer AppIcon.appiconsetavec la mise en page et le format corrects:

https://github.com/kindlychung/genicon

qed
la source
5

J'ai remanié le script de @ Henry pour le rendre meilleur:

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

Mettre à jour

Le -cparamètre de iconutil n'est plus pris en charge. Utilisez à la -—convertplace:

#!/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
dardo82
la source
4
La version originale est simple et on peut reproduire le processus manuellement dans n'importe quel shell.
Denis Barmenkov
1
Si vous préférez faire les choses manuellement, vous n'avez pas du tout besoin d'un ordinateur.
dardo82
5

Dead Simple .png 👉 .icns

  1. Téléchargez IconMaker.app - C'est juste un .applescript qui ne mord pas
  2. Faites glisser et déposez votre .png sur le IconMaker.app que vous venez de créer.

Plus d'infos : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

La mise à jour de High Sierra iconutil est maintenant plus stricte sur la taille .png source. Plus d'informations à ce sujet dans le billet de blog après le saut. ✌️

éoniste
la source
3

Lorsque je valide mon application, j'obtiens cette erreur:

le bundle d'application ne contient pas d'icône au format ICNS, contenant à la fois une image 512x512 et 512x512 @ 2x.

Je ne suis pas très bon avec la commande de terminal et donc peut-être que je fais quelque chose de mal. J'ai écrit:

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

D'une part, comme je l'ai mentionné dans un commentaire sur la réponse d'Anne, vous n'avez probablement pas besoin d'utiliser iconutil. Vous devriez pouvoir simplement ajouter l'ensemble d'icônes à votre projet et laisser Xcode le convertir pour vous dans le cadre de la construction.

Dans tous les cas, cela peut être votre problème:

J'ai essayé de mettre deux fichiers PNG ensemble (512x512 et 1024x1024)… mais j'obtiens toujours l'erreur.

Il n'y a pas de taille de 1024 sur 1024 points. L'élément de 1024 par 1024 pixels (qui était de 1024 points avant Mountain Lion) est maintenant utilisé pour 512 par 512 points @ 2x.

Votre fichier PNG doit être nommé correctement: [email protected]

Peter Hosey
la source
3

L'ancienne version 2.2 d'Icon Composer d'Apple fonctionne très bien, il vous suffit d'ouvrir le fichier .ICNS, d'appuyer sur le bouton 1024x1024 et d'ajouter votre image.

Valexa
la source
Je ne peux pas parler pour le demandeur d'origine, mais cette réponse est exactement ce dont j'avais besoin. Merci!
pestophage du
3
Les documents Apple disent «Remarque: n'utilisez pas Icon Composer - il ne peut pas créer de fichiers icns haute résolution». Autrement dit, les icônes @ 2x ne peuvent pas être faites de cette façon.
Clay Bridges
Icon Composer semble fonctionner correctement, il est expédié séparément du site des développeurs Apple dans le cadre du package Graphics Tools for Xcode. Voir aussi ici .
Michiel Kauw-A-Tjoe
3

Le code shell de @ dardo82 est bon et a fonctionné. En voici un plus simple en sh (pour tous les * nix) et plus rapide (comme si ça compte vraiment):

#!/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
MichaelT
la source
Merci pour la variation sur mon script, maintenant je ne sais même pas pourquoi j'ai utilisé zsh
dardo82
1

Voici une fonction principalement basée sur l'exemple de Henry (pourrait être utile dans ~/.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
}

Utilisation :

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

Crée 10 tailles de 16x16à 512x512@2x; accepte les images d'entrée au .pngformat uniquement.

je vais
la source
1

Courir iconutil -c icns Icon.iconset

Remarque

  • Icon.iconset est un dossier
  • Le nom commence par une minuscule icon_
  • Lorsque vous voyez Icon.icnsavec une image correcte, vous savez que cela fonctionne

entrez la description de l'image ici

onmyway133
la source
Pourquoi 3x? Apple n'en a pas besoin.
Neurotransmetteur
1

Il y a 2 tâches:
- créer 10 fichiers icns corrects
- faire en sorte que votre projet Xcode les utilise correctement

Comme j'ai eu des problèmes d'une heure avec ces deux tâches, et que je n'aime pas non plus quand je ne `` vois '' pas ce qui se passe, voici un chemin pour les prudents:

Créez 10 fichiers icns corrects:
J'ai utilisé le script ci-dessus de Henry: Il fonctionne toujours pour HighSierra et Xcode 9.2, y compris la commande «c».
Le fichier icns que j'ai obtenu est apparu comme une seule taille d'icône dans Finder / Quicklook et dans Aperçu n'a montré que 8 tailles sur 10.
J'ai donc utilisé le terminal, je suis allé avec cd dans mon dossier et j'ai utilisé la commande: iconutil -c iconset (icns filename) sur le fichier icns qui vient d'être créé pour retourner le fichier icns dans un dossier d'icônes, et - voilà - je pouvais voir mes 10 fichiers d'icônes nouvellement créés. En utilisant Quick look sur le dossier du jeu d'icônes (et en utilisant le mode plein écran pour pouvoir les zoomer avec le curseur), je pourrais vérifier que toutes les tailles sont vraiment très bien.

En passant: ils avaient l'air mieux que mes tentatives de redimensionnement avec PSE, probablement parce que je n'ai pas pris le temps de jouer avec toutes les options de redimensionnement de PSE. Si vous utilisez PSE, assurez-vous que vos fichiers png sont enregistrés sans profil de couleur. Aussi, avouant mon ignorance, pour moi un fichier 256x256 @ 2 équivaut à un fichier 512x512 - tous deux en 72 dpi. Essayer de suivre les commentaires 144 dpi ci-dessus n'a pas fonctionné pour moi.

Faites en sorte que votre projet Xcode les utilise correctement:
j'ai d'abord supprimé toutes mes tentatives infructueuses dans Xcode et commis une version propre dans le référentiel git (ce qui aurait été intelligent, aurait été de commettre une version propre d'abord - avant de démarrer frénétiquement l'icône addition odyssee).
Je me suis également assuré que dans le fichier info.plist, il n'y avait pas de pointeur lié à l'entrée `` fichier d'icône '' et que dans les paramètres généraux de mon projet, j'avais choisi AppIcon pour les icônes d'application. Ensuite, j'ai copié (glisser-déposer avec l'option enfoncée) du dossier du jeu d'icônes chaque fichier image png dans le Spaceholder AppIcon respectif. Encore une fois, je pouvais voir ce qui se passait. Xcode l'a converti en fichiers icns, ou peut-être - comme mon dossier d'icônes dérivé d'un dossier icns - les formats de fichier ont été acceptés.
Ensuite, j'ai ajouté un catalogue assets.asset et dans le catalogue des actifs un nouveau dossier AppIcon 'AppIcons and Launch Images' pour OS.

Ensuite, archivez et validez et il n'y aura aucune erreur lors du téléchargement ou de la validation.

Uwe
la source
Mise en page! Votre réponse est peut-être bonne, mais elle est illisible. Utilisez des paragraphes et des retours chariot.
Nic3500
0

J'avais besoin de ça, mais pour CMake. Je voulais aussi la possibilité de lui donner un SVG.

Voici l'essentiel: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

Et le code 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 ()
Qix - MONICA A ÉTÉ MISTRE
la source
-1

Bonjour, pour mes besoins j'ai réalisé un droplet qui fonctionne en glisser-déposer des icônes seules ou des icônes pour rechercher dans un dossier (je me suis limité aux dossiers car les recherches sur les Volumes de toutes les icônes peuvent prendre beaucoup de temps). Ainsi, en glisser-déposer, vous pouvez déposer des dossiers ou une application, tout ce qui peut contenir une icône. Le jeu d'icônes créé porte le nom de l'icône d'origine, il est placé dans un répertoire "/ aaaicones" et le chemin de l'icône. Exemple dans le dossier "/ aaaicones si vous soumettez xcode.app vous trouverez" /aaaicones/Applications/xcode.app/access.iconset "et /aaaicones/Applications/xcode.app/access.icns (l'icône recréée) il y aura être un fichier texte où il est tracé le chemin complet des icônes, Et le chemin vers l'exemple d'icônes correspondant "/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
deek5
la source