Как вручную создать icns файлы с помощью iconutil?


когда я проверяю свое приложение, я получаю эту ошибку:

пакет приложений не содержит значок в формате ICNS, содержащий оба 512x512 и 512x512@2x изображения.

я использую, чтобы сделать icns иконки с Img2icns приложения и до сегодняшнего дня он всегда работал правильно. Но теперь я получаю эту ошибку и нет никакого способа, чтобы заставить его работать. Я попытался собрать два файла PNG вместе (512x512 и 1024x1024) в Img2icns но я всегда получаю эту ошибку. Я также попытался следовать инструкциям в руководстве по человеческому интерфейсу OS X от Apple, но когда я пытаюсь сделать наборы значков, Я получаю эту терминальную ошибку:

- bash: синтаксическая ошибка рядом с неожиданным токеном 'newline'

Я не очень хорошо с терминальными командами, так что, возможно, я делаю что-то неправильно. Я написал:

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

если бы кто-нибудь мог помочь, это было бы очень ценно. Спасибо, Масси.

17 83

17 ответов:

проверьте следующие инструкции (ссылке):

используйте iconutil для создания файла icns вручную

The iconutil инструмент командной строки преобразует iconset папки для развертывания-готовые файлы icns с высоким разрешением. (Вы можете найти полную документацию для этого инструмента, введя man iconutil в терминале.) С помощью этого инструмента также сжимает полученный icns file, поэтому вам не нужно выполнять дополнительные действия компрессия.

чтобы преобразовать набор иконок в файл icns

введите эту команду в окно терминала:

iconutil -c icns <iconset filename>

здесь <iconset filename> - путь к папке, содержащей набор иконок, который вы хотите преобразовать в icns. Выходные данные записываются в то же место, что и iconset file, если вы не укажете выходной файл, как показано на рисунке:

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

в других слова, которые нужно заменить <iconset filename> путь:

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

поскольку путь содержит пробелы, необходимо использовать двойные кавычки, например:

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

эта команда должна работать должным образом.

вот скрипт для преобразования 1024x1024 png (с именем " Icon1024.png") в требуемый файл icns. Сохраните его в файл под названием " CreateICNS.src "в папке, где ваш png-файл находится в терминале" cd "в ту же папку и введите" source CreateICNS.src", чтобы назвать его:

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

есть модуль узла командной строки, который выполняет всю работу по преобразованию файла PNG в каталог iconset:

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

эти команды (введенные в терминал) работали для меня, чтобы преобразовать старый файл icns в новый формат:

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

обновление

The -c параметр iconutil больше не поддерживается. Используйте --convert вместо:

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

при использовании всех видов скриптов для преобразования hi-res PNG изображение для плеяды различных копий с низким разрешением может показаться удобным (и это действительно так), не следует забывать, что этот вид автоматического изменения размера будет отображать заметно несовершенные изображения.

чем меньше разрешение, тем размыт значок!

вместо этого вы всегда должны запрашивать логотип в некотором векторном формате, например в SVG, от вашего дизайнера. С этим на руке, вы можете вручную подготовьте идеальные файлы PNG во всех необходимых разрешениях, а затем сделайте один .icns файл, который сделает ваш значок приложения выглядеть красиво на каждом экране, от мобильного телефона до некоторых высокого класса Retina дисплей последней версии iMac.

из последних руководство Apple начиная с 2016 года, вы должны подготовить следующие файлы PNG:

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

после того, как все файлы PNG подготовлены, поместите их в какой-нибудь каталог с

дополнительный комментарий, Когда вы создаете .icns файл, вам нужно переименовать все файлы pic с префиксом " icon_", в противном случае, iconutil завершится с сообщением об ошибке: ".iconset: ошибка: не удалось создать ICNS.- что совсем не информативно.

я переработал сценарий @Henry, чтобы он выглядел лучше:

#!/bin/zsh
NAME=$(basename  .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  --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

обновление

The -c параметр iconutil больше не поддерживается. Используйте -—convert вместо:

#!/bin/zsh
NAME=$(basename  .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  --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR

Я написал сценарий bash для создания icns из файла 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 "" "$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

убедитесь, что у вас установлен imagemagick с поддержкой librsvg, на mac:

brew install imagemagick --with-librsvg

этот скрипт сослужил мне неплохую службу.


обновление

для более тщательного лечения я создал инструмент командной строки (написанный на Swift) для генерации AppIcon.appiconset с правильной планировкой и формат:

https://github.com/kindlychung/genicon

когда я проверяю свое приложение, я получаю эту ошибку:

пакет приложений не содержит значок в формате ICNS, содержащий как 512x512, так и 512x512@2x изображение.

Я не очень хорошо с командой терминал и поэтому, возможно, я делаю что-то неправильно. Я написал:

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

во-первых, как я уже упоминал в комментарии к ответу Анны, вам, вероятно, не нужно использовать iconutil. Вы должны иметь возможность просто добавить набор значков в свой проект и позволить Xcode конвертировать его для вас как часть сборки.

в любом случае, это может быть ваша проблема:

Я попытался поместить два PNG-файла вместе (512x512 и 1024x1024) ... но я всегда получаю ошибку.

нет 1024 на 1024, размер точки. элемент 1024 на 1024 пикселя (который был 1024 точки до Mountain Lion) теперь используется для 512 на 512 точек @2x.

ваш PNG файл должен быть назван соответствующим образом: icon_512x512@2x.png

более старая версия Apple Icon Composer 2.2 работает просто отлично, вы просто открываете .ICNS в нем, нажмите кнопку 1024x1024 и добавьте свое изображение.

мертвый простой .формат PNG. icns

  1. скачать IconMaker.приложение это просто .applescript не укусит
  2. перетащить .png на IconMaker.приложение, которое вы только что создали.

Подробнее: http://eon.коды/блог/2016/12/06/создание -- приложение-значок/

High sierra updateiconutil теперь более строго относится к источнику .размер ПНГ. Подробнее об этом в блоге после прыжок. ✌️

код оболочки@dardo82 хорош и работает. Вот более простой в sh (для всех *nix) и быстрее (как это действительно важно):

#!/bin/sh
#   This runs silent, be as verbose as you wish
NAME=$(basename  .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  --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

выполнить iconutil -c icns Icon.iconset

Примечание

    .набор иконок в папке
  • имя начинается с нижнего регистра icon_
  • когда вы видите Icon.icns С правильным изображением, вы знаете, он работает

enter image description here

Привет, для моих нужд я сделал капельку, которая работает только в значках перетаскивания или значках для поиска в папке (я ограничился папками, поскольку поиск на томах всех значков может занять много времени ). Таким образом, в перетаскивании вы можете удалить папки или приложения, все, что может содержать значок. Созданный набор иконок носит имя исходного значка, он помещается в каталог "/ aaaicones" и путь к значку. Пример в папке " / aaaicones, если вы отправляете xcode.приложение будет найти "/aaaicones / Applications / xcode.приложение / доступ.iconset " и /aaaicones / Applications / xcode.приложение / доступ.icns (воссозданный значок) там будет текстовый файл, где прослеживается полный путь значков , и путь к соответствующему примеру набора значков "/Приложения / xcode.приложение / содержание / приложения / инструменты.приложение/содержание/фреймворки / InstrumentsPlugIn.framework / Versions/A/Resources / access.icns" "/aaaicones / Applications / xcode.приложение / доступ.iconset " в приведенном примере (xcode) это может создать папка в конце (со всеми значками и набором значков) размером 214 МБ. Если вы обрабатываете только значок, он будет помещен в каталог "/ aaaicones / aIconeseule / " и его исходный путь, например /aaaicones/aIconeseule/Mac Elcapitan/.Томик.icns и /aaaicones/aIconeseule /Mac Elcapitan/.Томик.набор иконок с /aaaicones/aIconeseule/Mac Elcapitan / aalisticones.формат txt Капля находится ниже

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

вот функция, в основном основанная наГенри (может быть полезно в ~/.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 "" --out "$filename".iconset/icon_${i}x${i}.png
            sips -z $n $n "" --out "$filename".iconset/icon_${i}x${i}@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "" --out "$filename".iconset/icon_${n}x${n}.png
            (( i++ ))
        done
        cp "" "$filename".iconset/icon_512x512@2x.png
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

использование:

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

создает 10 размеров с 16x16 до 512x512@2x; для ввода изображений в .

то же самое, что и @Henry (комментарий выше), но принимает в качестве аргумента имя файла PNG и выводит ICNS с тем же именем.

Примечание : ожидается, что имя файла PNG будет иметь только 1 точку для отдельного расширения, т. е. xpto.формат PNG.

Итак, сохраните приведенный ниже код в файл под названием " CreateICNS.src " в папке, где находится ваш png-файл.

код :

IFS='.' read -ra ADDR <<< ""
ICONSET=${ADDR[0]}.iconset
mkdir $ICONSET
sips -z 16 16      --out $ICONSET/icon_16x16.png
sips -z 32 32      --out $ICONSET/icon_16x16@2x.png
sips -z 32 32      --out $ICONSET/icon_32x32.png
sips -z 64 64      --out $ICONSET/icon_32x32@2x.png
sips -z 128 128    --out $ICONSET/icon_128x128.png
sips -z 256 256    --out $ICONSET/icon_128x128@2x.png
sips -z 256 256    --out $ICONSET/icon_256x256.png
sips -z 512 512    --out $ICONSET/icon_256x256@2x.png
sips -z 512 512    --out $ICONSET/icon_512x512.png
cp  $ICONSET/icon_512x512@2x.png
iconutil -c icns $ICONSET
rm -R $ICONSET

КАК ИСПОЛЬЗОВАТЬ :

затем в терминал, " cd " в ту же папку и введите:

source CreateICNS.src {PNG filename}

где {PNG filename} - это имя вашего PNG файла, т. е. xpto.формат PNG.

Если ваш файл будет называться abc.ПНГ можно использовать :

source CreateICNS.src abc.png

есть 2 задачи:
- создайте 10 правильных файлов icns
- сделать ваш проект Xcode, чтобы использовать их правильно

поскольку у меня были часовые проблемы с обеими этими задачами, а также не нравится, когда я не "вижу", что происходит, здесь путь для осторожных:

создайте 10 правильных файлов icns:
Я использовал сценарий выше от Генри: он по-прежнему работает для HighSierra и Xcode 9.2, включая команду "c".
Файл icns I получил, появился как только один размер значка в Finder / Quicklook и в предварительном просмотре показал только 8 из 10 размеров.
Поэтому я использовал терминал, пошел с компакт-диска на папку команду: iconutil -с набор иконок (icns по именем) на только что созданный файл icns, чтобы восстановить файл icns на набор иконок папки, и - се & се, - я мог видеть мой вновь созданный 10 значок файлов. Используя быстрый взгляд на папку iconset (и используя полноэкранный режим, чтобы иметь возможность масштабировать их с помощью ползунка), я мог бы проверить, что все размеры на самом деле выглядят очень хорошо.

в сторону: они выглядели лучше, чем мои попытки изменения размера с PSE, скорее всего, потому что я не нашел времени, чтобы играть со всеми вариантами изменения размера в PSE. Если вы используете PSE, убедитесь, что ваши png файлы сохраняются без цветового профиля. Кроме того, признаюсь в своем невежестве, для меня файл 256x256@2 - это то же самое, что и файл 512x512-оба в 72dpi. Попытка следовать комментариям 144 dpi выше не сработала для меня.

получите ваш Проект Xcode, чтобы использовать их правильно:
Сначала я удалил все свои бесплодные попытки в Xcode и совершил чистую версию в репозиторий git (что было бы умно, было бы сначала совершить чистую версию - прежде чем я отчаянно начал добавление значка odyssee).
Я также убедился, что в информации.plist file нет указателя, связанного с записью "icon file", и что в моих общих настройках проекта я выбрал AppIcon для значков приложений.
Затем я добавил имущество.каталог активов и в каталоге активов новая папка Appicons и Launch Images для ОС.
Затем я скопировал (перетаскивание с нажатой опцией) из папки iconset каждый файл изображения png в соответствующий пробел AppIcon. Так что я снова мог видеть, что происходит. Xcode преобразовал это в файлы icns, или, может быть, как моя папка iconset, полученная из папки icns, форматы файлов были приняты.

затем архивируйте и проверяйте, и не будет ошибки при загрузке или проверки.