¿Cómo crear archivos icns manualmente usando iconutil?


106

Cuando estoy validando mi aplicación, aparece este error:

el paquete de la aplicación no contiene un icono en formato ICNS, que contiene tanto 512x512una 512x512@2ximagen como una .

Yo solía hacer los íconos icns con la aplicación Img2icns y hasta hoy siempre funcionaba correctamente. Pero ahora recibo ese error y no hay forma de que funcione. Intenté juntar dos archivos PNG ( 512x512y 1024x1024) en Img2icns pero siempre obtengo ese error. También intenté seguir las instrucciones de la Guía de interfaz humana OS X de Apple, pero cuando trato de hacer los conjuntos de iconos, aparece este error de terminal:

-bash: error de sintaxis cerca del token inesperado 'nueva línea'

No soy muy bueno con los comandos de la terminal, así que tal vez esté haciendo algo mal. Escribí:

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

Si alguien pudiera ayudar sería muy apreciado. Gracias, Massy.


Creé una aplicación que envuelve iconutil para facilitar esto: hobbyistsoftware.com/icontool
Confused Vorlon

Respuestas:


63

Consulte las siguientes instrucciones ( enlace ):

Utilice iconutil para crear un archivo icns manualmente

La iconutilherramienta de línea de comandos convierte iconsetcarpetas en archivos icns de alta resolución listos para la implementación. (Puede encontrar la documentación completa para esta herramienta ingresando man iconutilen Terminal). El uso de esta herramienta también comprime el icnsarchivo resultante , por lo que no es necesario que realice una compresión adicional.

Para convertir un conjunto de iconos en un archivo icns

Ingrese este comando en la ventana de Terminal:

iconutil -c icns <iconset filename>

donde <iconset filename>es la ruta a la carpeta que contiene el conjunto de iconos al que desea convertir icns. La salida se escribe en la misma ubicación que iconset file, a menos que especifique un archivo de salida como se muestra:

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

En otras palabras, debe reemplazar <iconset filename>por la ruta:

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

Dado que la ruta contiene espacios, debe usar comillas dobles, por ejemplo:

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

Este comando debería funcionar correctamente.


2
Sin iconutilembargo, probablemente no necesite usarlo . Puede simplemente agregar el conjunto de iconos a su proyecto y dejar que Xcode lo convierta por usted como parte de la compilación. Eso se trata en la sección inmediatamente anterior (muy corta): developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Peter Hosey

@Anne: excepto que el comando iconutil solo se incluye con las versiones del sistema operativo que no usan archivos ICNS ... No nos aman los que usamos OS10.6.8 V1.1 ... es aún peor 'nuestro camino o la carretera' para los desarrolladores que para los usuarios.
Henrik Erlandsson

@Anne: Eso funcionó ... ¡muchas gracias! (también gracias por establecer mi pregunta correctamente). Peace, Massy
Blue

@HenrikErlandsson: Todas las versiones de Mac OS X usan archivos .icns, desde la 10.0.
Peter Hosey

10
Deben existir los siguientes archivos: 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. Los archivos @ 2x deben almacenarse a 144 píxeles por pulgada, mientras que los demás deben almacenarse a 72 píxeles por pulgada.
carmin

284

Aquí hay un script para convertir un png de 1024x1024 (llamado "Icon1024.png") al archivo icns requerido. Guárdelo en un archivo llamado "CreateICNS.src" en la carpeta donde se encuentra su archivo png en el terminal "cd" en la misma carpeta y escriba "source CreateICNS.src" para llamarlo:

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
Magnífico. puse Icon1024.png en el escritorio, y simplemente ejecuté su código y listo
Logic

2
¿Es posible que este pequeño guión perfecto se haya roto en El Capitán? Actualicé mi Mac a 10.11.3 y este script ahora devuelve "error: formato de imagen no admitido" y luego "/Users/IconScript/MyIcon-osx.iconset:error: La variante llamada 'icono' no contiene recursos de imagen". luego "MyIcon-osx.iconset: error: No se pudo generar ICNS". Probé el mismo script y archivo .png en una Mac que no está actualizado a El Capitan y funcionó allí como siempre ... = (
RanLearns

1
Sí @Henry, solo estaba eliminando los nombres de las carpetas para intentar hacer que el comentario sea más limpio, lo estoy ejecutando en la Terminal desde la carpeta que contiene el script y los iconos src. Lo único diferente que antes es El Capitan vs Yosemite ... Literalmente usé el script antes de actualizar el sistema operativo con éxito y luego justo después de actualizar (en la misma carpeta, los mismos comandos de Terminal) y ahora devuelve ese error. ¿Has tenido éxito con él en El Capitán?
RanLearns

3
Aspectos importantes a tener en cuenta: los nombres de archivo de la imagen del icono deben comenzar con "icon_". Las imágenes deben tener un canal alfa. Puede agregar un canal alfa con ImageMagick si es necesario convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson

1
Dios mio. Crear una aplicación electrónica y lidiar con íconos ha sido una molestia. todos los tutoriales del blog apuntan a utilidades en línea obsoletas. su sencillo script aquí en Stackerflow me acaba de alegrar el día. ¡gracias!
nelsonenzo

26

Si bien el uso de todo tipo de scripts para convertir PNGimágenes de alta resolución en una pléyade de diferentes copias de baja resolución puede parecer útil (y realmente lo es), no se debe olvidar que este tipo de cambio de tamaño automático generará imágenes perceptiblemente imperfectas .

Menos resolución, más borroso el icono.

Quiero decir, a mí imagemagicktambién me encanta , ¡pero no es la herramienta adecuada para esta tarea!

En su lugar, siempre debe solicitar un logotipo en algún formato vectorial a su diseñador, por ejemplo, en SVG. Con esto a mano, puede preparar manualmente PNGarchivos perfectos en todas las resoluciones requeridas y luego hacer una.icns archivo, lo que hará que el ícono de su aplicación se vea hermoso en cada pantalla, desde un iPhone SE barato hasta una pantalla Retina de alta gama de lo último iMac. Puede usar Photoshop, GIMP o cualquier otra herramienta de su elección para generar estos PNG.

A partir de las últimas Directrices de interfaz humana de Apple a partir de 2020, debe preparar los siguientes PNGarchivos:

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

Después de que todos los archivos PNG estén preparados, colóquelos en algún directorio con .iconsetextensión ( Logos.iconsetpor ejemplo) y ejecute lo siguiente desde Terminal:

iconutil --convert icns Logos.iconset

Si no hubo errores después de ejecutar este comando, entonces todos los archivos se procesaron correctamente y obtuviste el Logos.icnsarchivo en el mismo directorio, que contiene todos los hermosos logotipos nítidos para tu aplicación que se adaptarán a cualquier pantalla moderna.


16

Hay un módulo de nodo de línea de comandos que hace todo el trabajo de convertir un archivo PNG en un directorio de conjunto de iconos:

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

9
Ya no es compatible. :(
jamescampbell

13

Estos comandos (ingresados ​​en la Terminal) me funcionaron para convertir un archivo icns antiguo al nuevo 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

Actualizar

El -cparámetro de iconutil ya no es compatible. Utilice en su --convertlugar:

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
¡Gracias por mostrar esto, gracias a esto pude revertir desde icns para obtener los png! :)
Noitidart

9

Comentario adicional, cuando crea un archivo .icns, necesita cambiar el nombre de todos los archivos de imagen con el prefijo "icon_ ", de lo contrario, iconutil fallará con el mensaje de error: ".iconset: error: No se pudo generar ICNS". que no es informativo en absoluto.


7

Igual que @Henry (comentario anterior) pero toma como argumento el nombre del archivo PNG y genera el ICNS con el mismo nombre.

NOTA: Solo se espera que el nombre del archivo PNG tenga 1 punto de extensión separada, es decir, xpto.png.

Por lo tanto, guarde el código a continuación en un archivo llamado "CreateICNS.src" en la carpeta donde está su archivo png.

CODIGO:

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

CÓMO UTILIZAR :

Luego, en la terminal, "cd" a la misma carpeta y escribe:

source CreateICNS.src {PNG filename}

donde {nombre de archivo PNG} es el nombre de su archivo PNG, es decir, xpto.png.

Si su archivo se llamaría abc.png, usaría:

source CreateICNS.src abc.png

¡Increíble! Muy simple :) quizás convertirlo en un .sh / script lo haría aún más :) ¡Gracias!
Gutemberg Ribeiro

6

He escrito un script bash para hacer icns a partir de un archivo 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

Asegúrese de tener imagemagick instalado con soporte librsvg, en mac:

brew install imagemagick --with-librsvg

Este guión me ha servido bastante bien.


Actualizar

Para un tratamiento más completo, he creado una herramienta de línea de comandos (escrita en Swift) para generar AppIcon.appiconsetcon el diseño y formato correctos:

https://github.com/kindlychung/genicon


5

He refactorizado el script de @ Henry para que se vea mejor:

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

Actualizar

El -cparámetro de iconutil ya no es compatible. Utilice en su -—convertlugar:

#!/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 versión original es simple y se puede reproducir el proceso manualmente en cualquier shell.
Denis Barmenkov

1
Si prefiere hacer las cosas manualmente, no necesita una computadora en absoluto.
dardo82

5

Muerto simple .png 👉 .icns

  1. Descarga IconMaker.app : es solo un .applescript que no muerde
  2. Arrastre y suelte su .png en la aplicación IconMaker.app que acaba de crear.

Más información : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

Actualización de High Sierra iconutil ahora es más estricta con respecto al tamaño .png de origen. Más sobre esto en la publicación del blog después del salto. ✌️


3

Cuando estoy validando mi aplicación, aparece este error:

el paquete de aplicación no contiene un icono en formato ICNS, que contiene una imagen de 512x512 y 512x512 @ 2x.

No soy muy bueno con el comando de terminal y tal vez estoy haciendo algo mal. Escribí:

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

Por un lado, como mencioné en un comentario sobre la respuesta de Anne, probablemente no necesite usar iconutil. Debería poder agregar el conjunto de iconos a su proyecto y dejar que Xcode lo convierta por usted como parte de la compilación.

De cualquier manera, este puede ser tu problema:

Intenté poner dos archivos PNG juntos (512x512 y 1024x1024)… pero siempre aparece el error.

No hay un tamaño de 1024 por 1024 puntos. El elemento de 1024 por 1024 píxeles (que era 1024 puntos antes de Mountain Lion) ahora se usa para 512 por 512 puntos @ 2x.

Su archivo PNG debe tener el nombre apropiado: icon_512x512@2x.png


3

La versión 2.2 de Icon Composer más antigua de Apple funciona bien, simplemente abra el .ICNS, presione el botón 1024x1024 y agregue su imagen.


No puedo hablar de la pregunta original autor de la pregunta, pero esta respuesta es exactamente lo que necesitaba. ¡Gracias!
pestófago

3
Los documentos de Apple dicen "Nota: no uses Icon Composer, no puede crear archivos icns de alta resolución". Es decir, los iconos @ 2x no se pueden hacer de esa manera.
Clay Bridges

Icon Composer parece funcionar bien, se envía por separado desde el sitio de desarrolladores de Apple como parte del paquete Graphics Tools for Xcode. Consulte también aquí .
Michiel Kauw-A-Tjoe

3

El código de shell de @ dardo82 es bueno y funciona. Aquí hay uno más simple en sh (para todos los * nix) y más rápido (como si realmente importara):

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

Gracias por la variación en mi guión, ahora ni siquiera estoy seguro de por qué usé zsh
dardo82

1

Aquí hay una función basada principalmente en el ejemplo de Henry (podría ser útil en ~/.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
}

Uso :

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

Crea 10 tamaños de 16x16a 512x512@2x; acepta imágenes de entrada .pngsolo en formato.


1

correr iconutil -c icns Icon.iconset

Nota

  • Icon.iconset es una carpeta
  • El nombre comienza con minúsculas icon_
  • Cuando ve Icon.icnscon la imagen correcta, sabe que funciona

ingrese la descripción de la imagen aquí


¿Por qué 3x? Apple no lo requiere.
Neurotransmisor

1

Hay 2 tareas:
- crear 10 archivos icns correctos
- hacer que su proyecto Xcode los use correctamente

Como tuve problemas de una hora con ambas tareas, y tampoco me gusta cuando no 'veo' lo que está sucediendo, aquí hay un camino para los cautelosos:

Cree 10 archivos icns correctos:
utilicé el script anterior de Henry: todavía funciona para HighSierra y Xcode 9.2, incluido el comando 'c'.
El archivo icns que obtuve apareció como un solo tamaño de icono en Finder / Quicklook y en Vista previa mostró solo 8 de 10 tamaños.
Así que usé terminal, fui con cd a mi carpeta y usé el comando: iconutil -c iconset (nombre de archivo icns) en el archivo icns recién creado para revertir el archivo icns a una carpeta de conjunto de iconos, y, he aquí, pude ver mis 10 archivos de iconos recién creados. Usando Vista rápida en la carpeta del conjunto de iconos (y usando el modo de pantalla completa para poder hacer zoom a través de ellos con el control deslizante), pude verificar que todos los tamaños se vean realmente bien.

Como comentario al margen: se veían mejor que mis intentos de cambio de tamaño con PSE, muy probablemente porque no me tomé el tiempo para jugar con todas las opciones de cambio de tamaño en PSE. Si usa PSE, asegúrese de que sus archivos png se guarden sin perfil de color. Además, confesando mi ignorancia, para mí un archivo de 256x256 @ 2 es lo mismo que un archivo de 512x512, ambos en 72 ppp. Intentar seguir los comentarios de 144 dpi anteriores no funcionó para mí.

Haga que su proyecto de Xcode los use correctamente:
Primero eliminé todos mis intentos infructuosos dentro de Xcode y envié una versión limpia al repositorio de git (lo que hubiera sido inteligente, hubiera sido enviar una versión limpia primero, antes de iniciar frenéticamente el icono además odisea).
También me aseguré de que en el archivo info.plist no haya ningún puntero vinculado a la entrada 'archivo de icono' y que en la configuración general de mi proyecto había elegido AppIcon para iconos de aplicaciones.
Luego agregué un catálogo de assets.asset y dentro del catálogo de assets una nueva Carpeta AppIcon 'AppIcons and Launch Images' para OS.
Luego copié (arrastre y suelte con la opción presionada) de la carpeta del conjunto de iconos cada archivo de imagen png en el correspondiente marcador de espacio de AppIcon. De nuevo, pude ver lo que está sucediendo. Xcode lo convirtió en archivos icns, o tal vez, como mi carpeta de conjunto de iconos deriva de una carpeta icns, los formatos de archivo fueron aceptados.

Luego archive y valide y no habrá errores al cargar o validar.


¡Formateando! Tu respuesta puede ser buena, pero no se puede leer. Utilice párrafos y retornos de carro.
Nic3500

0

Necesitaba esto, pero para CMake. También quería la opción de darle un SVG.

Aquí está la esencia: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

Y el código de 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

Hola, para mis necesidades hice un droplet que funciona solo para arrastrar y soltar íconos o íconos para buscar en una carpeta (me limité a carpetas ya que las búsquedas en Volúmenes de todos los íconos pueden llevar mucho tiempo). Entonces, al arrastrar y soltar, puede soltar carpetas o aplicaciones, cualquier cosa que pueda contener un icono. El conjunto de iconos creado lleva el nombre del icono original, se coloca en un directorio "/ aaaicones" y la ruta del icono. Ejemplo en la carpeta "/ aaaicones si envía xcode.app encontrará" /aaaicones/Applications/xcode.app/access.iconset "y /aaaicones/Applications/xcode.app/access.icns (el icono recreado) allí ser un archivo de texto donde se rastrea la ruta completa de los íconos, y la ruta al ejemplo correspondiente del conjunto de íconos "/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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.