Como criar arquivos icns manualmente usando o iconutil?


106

Quando estou validando meu aplicativo, recebo este erro:

o pacote de aplicativos não contém um ícone no formato ICNS, contendo ae 512x512uma 512x512@2ximagem.

Costumo fazer ícones icns com o app Img2icns e até hoje sempre funcionou direito. Mas agora estou recebendo aquele erro e não há como fazer funcionar. Tentei colocar dois arquivos PNG juntos ( 512x512e 1024x1024) no Img2icns, mas sempre recebo esse erro. Eu também tentei seguir as instruções nas Diretrizes de Interface Humana do OS X da Apple, mas quando tento fazer os conjuntos de ícones recebo este erro de terminal:

-bash: erro de sintaxe próximo ao token inesperado 'nova linha'

Não sou muito bom com comandos de terminal, então talvez esteja fazendo algo errado. Eu escrevi:

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

Se alguém pudesse ajudar, seria muito apreciado. Obrigado, Massy.


Eu desenvolvi um aplicativo que envolve o iconutil para tornar isso mais fácil: hobbyistsoftware.com/icontool
Confused Vorlon

Respostas:


63

Confira as seguintes instruções ( link ):

Use o iconutil para criar um arquivo icns manualmente

A iconutilferramenta de linha de comando converte iconsetpastas em arquivos icns de alta resolução e prontos para implantação. (Você pode encontrar a documentação completa para esta ferramenta entrando man iconutilno Terminal.) Usar esta ferramenta também comprime o resultadoicns arquivo , portanto, não há necessidade de realizar compactação adicional.

Para converter um conjunto de ícones em um arquivo icns

Digite este comando na janela do Terminal:

iconutil -c icns <iconset filename>

onde <iconset filename>é o caminho para a pasta que contém o conjunto de ícones para os quais você deseja converter icns. A saída é gravada no mesmo local que o iconset file, a menos que você especifique um arquivo de saída conforme mostrado:

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

Em outras palavras, você precisa substituir <iconset filename>pelo caminho:

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

Como o caminho contém espaços, você precisa usar aspas duplas, por exemplo:

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

Este comando deve funcionar corretamente.


2
Você provavelmente não precisa usar iconutil, no entanto. Você pode simplesmente adicionar o conjunto de ícones ao seu projeto e deixar o Xcode convertê-lo para você como parte da construção. Isso é abordado na seção imediatamente anterior (muito curta): developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Peter Hosey

@Anne: exceto que o comando iconutil está incluído apenas com as versões do sistema operacional que não usam arquivos ICNS ... Não ame nós que usamos OS10.6.8 V1.1 ... é ainda pior 'nosso caminho ou a estrada' para os desenvolvedores do que para os usuários.
Henrik Erlandsson

@Anne: Funcionou ... muito obrigado! (também obrigado por definir minha pergunta corretamente). Peace, Massy
Blue

@HenrikErlandsson: Todas as versões do Mac OS X usam arquivos .icns, desde a versão 10.0.
Peter Hosey,

10
Os seguintes arquivos devem existir: 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. Os arquivos @ 2x devem ser armazenados a 144 pixels por polegada, enquanto os outros devem ser armazenados a 72 pixels por polegada.
carmim

284

Aqui está um script para converter um png 1024x1024 (denominado "Icon1024.png") no arquivo icns necessário. Salve-o em um arquivo chamado "CreateICNS.src" na pasta onde seu arquivo png está no terminal "cd" para a mesma pasta e digite "source CreateICNS.src" para chamá-lo:

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
Excelente. coloquei Icon1024.png na área de trabalho e apenas executei seu código e pronto
Logic

2
É possível que esse pequeno script perfeito tenha sido quebrado no El Capitan? Atualizei meu Mac para 10.11.3 e este script agora retorna "erro: Formato de imagem não suportado" e "/Users/IconScript/MyIcon-osx.iconset:error: Variante chamada 'ícone' não contém recursos de imagem." em seguida, "MyIcon-osx.iconset: erro: Falha ao gerar ICNS." Tentei o mesmo script e arquivo .png em um Mac que não é atualizado para El Capitan e funcionou lá como sempre ... = (
RanLearns

1
Sim @Henry, eu estava apenas removendo os nomes das pastas para tentar tornar o comentário mais limpo, estou executando no Terminal de dentro da pasta que contém o script src e os ícones. A única coisa diferente de antes é El Capitan vs Yosemite ... Eu literalmente usei o script antes de atualizar o SO com sucesso e logo após a atualização (na mesma pasta, mesmos comandos de Terminal) e agora ele retorna aquele erro. Você teve sucesso com isso no El Capitan?
RanLearns de

3
Pontos importantes a serem observados: os nomes de arquivos de imagem de seu ícone devem começar com "icon_". As imagens devem ter canal alfa. Você pode adicionar um canal alfa com ImageMagick se necessário convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson

1
AMD. construir um aplicativo de elétrons e lidar com ícones tem sido uma chatice. todos os tutoriais do blog apontam para utilitários online desatualizados. seu script simples aqui no stackerflow acabou de fazer meu dia. obrigado!
nelsonenzo

26

Embora o uso de todos os tipos de scripts para converter imagens de alta resolução PNGem uma infinidade de diferentes cópias de baixa resolução possa parecer útil (e realmente é), não se deve esquecer que esse tipo de redimensionamento automático irá renderizar imagens perceptivelmente imperfeitas .

Menor a resolução - mais borrado o ícone!

Quer dizer, eu imagemagicktambém adoro , mas não é a ferramenta certa para essa tarefa!

Em vez disso, você deve sempre solicitar um logotipo em algum formato vetorial de seu designer, por exemplo, em SVG. Com isso em mãos, você pode preparar manualmente PNGarquivos perfeitos em todas as resoluções necessárias e, em seguida, fazer um único.icns arquivo, o que tornará o ícone do seu aplicativo lindo em cada tela, de um iPhone SE barato a algumas telas Retina de última geração iMac. Você pode usar Photoshop, GIMP ou qualquer outra ferramenta de sua escolha para gerar esses PNGs.

Com base nas últimas Diretrizes de Interface Humana da Apple em 2020, você deve preparar os seguintes PNGarquivos:

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

Depois que todos os arquivos PNG forem preparados, coloque-os em algum diretório com .iconsetextensão ( Logos.iconsetpor exemplo) e execute o seguinte a partir de Terminal:

iconutil --convert icns Logos.iconset

Se não houve erros após a execução deste comando, todos os arquivos foram processados ​​corretamente e você obteve o Logos.icnsarquivo no mesmo diretório, contendo todos os belos logotipos nítidos para seu aplicativo que se adequam a qualquer tela moderna.


16

Há um módulo de nó de linha de comando que faz todo o trabalho de conversão de um arquivo PNG em um diretório de conjunto de ícones:

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

9
Não mais suportado. :(
jamescampbell

13

Esses comandos (inseridos no Terminal) funcionaram para mim para converter um arquivo icns antigo para o novo 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

Atualizar

O -cparâmetro para iconutil não é mais compatível. Use em seu --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
Obrigado por mostrar isso, graças a isso eu fui capaz de reverter de icns para obter os pngs! :)
Noitidart

9

Comentário adicional, ao criar o arquivo .icns, você precisa renomear todos os arquivos pic com o prefixo "icon_ ", caso contrário, o iconutil falhará com a mensagem de erro: ".iconset: erro: Falha ao gerar ICNS." o que não é nada informativo.


7

O mesmo que @Henry (comentário acima), mas leva como argumento o nome do arquivo PNG e gera o ICNS com o mesmo nome.

NOTA: O nome do arquivo PNG deve ter apenas 1 ponto para a extensão separada, ou seja, xpto.png.

Portanto, salve o código abaixo em um arquivo chamado "CreateICNS.src" na pasta onde está seu arquivo PNG.

CÓDIGO:

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

COMO USAR :

Em seguida, no terminal, "cd" para a mesma pasta e digite:

source CreateICNS.src {PNG filename}

onde {PNG filename} é o nome do seu arquivo PNG, ou seja, xpto.png.

Se o nome do seu arquivo fosse abc.png, você usaria:

source CreateICNS.src abc.png

Impressionante! Muito simples :) talvez torná-lo um .sh / script o tornaria ainda mais :) Obrigado!
Gutemberg Ribeiro

6

Eu escrevi um script bash para fazer icns a partir de um arquivo 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

Certifique-se de ter o imagemagick instalado com suporte a librsvg, no mac:

brew install imagemagick --with-librsvg

Este script me serviu muito bem.


Atualizar

Para um tratamento mais completo, criei uma ferramenta de linha de comando (escrita em Swift) para gerar AppIcon.appiconsetcom o layout e formato corretos:

https://github.com/kindlychung/genicon


5

Refatorei o script de @Henry para torná-lo melhor:

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

Atualizar

O -cparâmetro para iconutil não é mais compatível. Use em seu -—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
A versão original é simples e pode-se reproduzir o processo manualmente em qualquer shell.
Denis Barmenkov,

1
Se você prefere fazer as coisas manualmente, não precisa de um computador.
dardo82,

5

Dead simple .png 👉 .icns

  1. Baixe IconMaker.app - é apenas um .applescript que não morderá
  2. Arraste e solte seu .png no IconMaker.app que você acabou de criar.

Mais informações : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

A atualização do High sierra iconutil agora é mais restrita quanto ao tamanho .png de origem. Mais sobre isso na postagem do blog após o salto. ✌️


3

Quando estou validando meu aplicativo, recebo este erro:

o pacote do aplicativo não contém um ícone no formato ICNS, contendo uma imagem 512x512 e 512x512 @ 2x.

Não sou muito bom com comandos de terminal e talvez esteja fazendo algo errado. Eu escrevi:

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

Por um lado, como mencionei em um comentário sobre a resposta de Anne, você provavelmente não precisa usar o iconutil. Você deve ser capaz de apenas adicionar o conjunto de ícones ao seu projeto e deixar o Xcode convertê-lo para você como parte da construção.

De qualquer forma, este pode ser o seu problema:

Tentei juntar dois arquivos PNG (512x512 e 1024x1024) ... mas sempre recebo o erro.

Não há tamanho de 1024 por 1024 pontos. O elemento de 1024 por 1024 pixels (que era de 1024 pontos antes do Mountain Lion) agora é usado para 512 por 512 pontos @ 2x.

Seu arquivo PNG deve ter o nome apropriado: icon_512x512@2x.png


3

O antigo Icon Composer da Apple versão 2.2 funciona bem, basta abrir o .ICNS nele, pressionar o botão 1024x1024 e adicionar sua imagem.


não posso falar pelo autor da pergunta original, mas essa resposta é exatamente o que eu precisava. obrigado!
pestófago

3
Os documentos da Apple dizem "Observação: não use o Icon Composer - ele não pode criar arquivos icns de alta resolução". Ou seja, os ícones @ 2x não podem ser feitos dessa forma.
Clay Bridges

O Icon Composer parece funcionar bem, ele é enviado separadamente do site do desenvolvedor da Apple como parte do pacote Graphics Tools for Xcode. Veja também aqui .
Michiel Kauw-A-Tjoe

2

O código de shell de @ dardo82 está bom e funcionou. Aqui está um mais simples em sh (para todos os * nix's) e mais rápido (como se realmente importasse):

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

Obrigado pela variação no meu script, agora nem tenho certeza porque usei zsh
dardo82

1

Aqui está uma função baseada principalmente no exemplo de Henry (pode ser útil em ~/.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

Cria 10 tamanhos de 16x16a 512x512@2x; aceita imagens de entrada .pngapenas em formato.


1

Corre iconutil -c icns Icon.iconset

Nota

  • Icon.iconset é uma pasta
  • Nome começa com letras minúsculas icon_
  • Quando você vê Icon.icnscom a imagem correta, você sabe que funciona

insira a descrição da imagem aqui


Porque 3x? A Apple não exige isso.
Neurotransmissor

1

Existem 2 tarefas:
- criar 10 arquivos icns corretos
- fazer seu projeto Xcode usá-los corretamente

Como tive problemas de horas com ambas as tarefas, e também não gosto quando não 'vejo' o que está acontecendo, aqui um caminho para os cautelosos:

Crie 10 arquivos icns corretos:
Usei o script acima de Henry: ainda funciona para HighSierra e Xcode 9.2, incluindo o comando 'c'.
O arquivo icns que recebi apareceu como apenas um tamanho de ícone no Finder / Quicklook e na Visualização mostrou apenas 8 de 10 tamanhos.
Então eu usei o terminal, fui com cd para minha pasta e usei o comando: iconutil -c iconset (nome de arquivo icns) no arquivo icns recém-criado para reverter o arquivo icns de volta para uma pasta de iconset, e - vejam só - eu pude ver meus 10 arquivos de ícone recém-criados. Usando a visualização rápida na pasta do conjunto de ícones (e usando o modo de tela inteira para poder ampliá-los com o controle deslizante), pude verificar se todos os tamanhos estão realmente parecendo muito bem.

Como um aparte: eles pareciam melhores do que minhas tentativas de redimensionamento com PSE, provavelmente porque eu não perdi tempo para brincar com todas as opções de redimensionamento no PSE. Se você usar PSE, certifique-se de que seus arquivos PNG sejam salvos sem perfil de cor. Além disso, confessando minha ignorância, para mim um arquivo 256x256 @ 2 é igual a um arquivo 512x512 - ambos em 72dpi. Tentar seguir os comentários de 144 dpi acima não funcionou para mim.

Obtenha seu projeto Xcode para usá-los corretamente:
primeiro eu excluí todas as minhas tentativas infrutíferas dentro do Xcode e enviei uma versão limpa para o repositório git (o que teria sido inteligente, teria sido submeter uma versão limpa primeiro - antes de iniciar freneticamente o ícone adição odyssee).
Também me certifiquei de que no arquivo info.plist não há nenhum ponteiro vinculado à entrada do 'arquivo de ícone' e que nas configurações gerais do projeto eu escolhi AppIcon para ícones de aplicativos.
Em seguida, adicionei um catálogo de assets.asset e dentro do catálogo de ativos uma nova pasta AppIcon 'AppIcons and Launch Images' para OS.
Em seguida, copiei (arraste e solte com a opção pressionada) da pasta do conjunto de ícones cada arquivo de imagem png para o respectivo AppIcon Spaceholder. Então, novamente, eu pude ver o que está acontecendo. O Xcode converteu isso em arquivos icns, ou talvez - como minha pasta iconset derivada de uma pasta icns - os formatos de arquivo foram aceitos.

Em seguida, arquive e valide e não haverá erros durante o upload ou validação.


Formatando! Sua resposta pode ser boa, mas ilegível. Use parágrafos e retornos de carro.
Nic3500

0

Eu precisava disso, mas para CMake. Também queria a opção de fornecer um SVG.

Aqui está a essência: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

E o código 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

Olá, para minhas necessidades fiz um droplet que funciona em arrastar e soltar ícones sozinho ou ícones para pesquisar em uma pasta (limitei-me a pastas porque as pesquisas em Volumes de todos os ícones podem demorar muito). Assim, ao arrastar e soltar, você pode soltar pastas ou aplicativos, qualquer coisa que possa conter um ícone. O conjunto de ícones criado leva o nome do ícone original, é colocado em um diretório "/ aaaicones" e o caminho do ícone. Exemplo na pasta "/ aaaicones se você enviar xcode.app, você encontrará" /aaaicones/Applications/xcode.app/access.iconset "e /aaaicones/Applications/xcode.app/access.icns (o ícone recriado). ser um arquivo de texto onde é traçado o caminho completo dos ícones, E o caminho para o exemplo do conjunto de ícones correspondente "/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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.