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

107

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

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

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

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

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

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

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

Синий
источник
Чтобы упростить эту задачу, я создал приложение, которое обертывает iconutil: hobbyistsoftware.com/icontool
Confused Vorlon

Ответы:

63

Ознакомьтесь со следующими инструкциями ( ссылка ):

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

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

Чтобы преобразовать набор иконок в файл 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"

Эта команда должна работать правильно.

Энн
источник
2
Однако вам, вероятно, не нужно использовать iconutil. Вы можете просто добавить набор значков в свой проект и позволить Xcode преобразовать его за вас как часть сборки. Об этом рассказывается в предыдущем (очень коротком) разделе: developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Питер Хози,
@Anne: за исключением того, что команда iconutil включена только в версии ОС, которые не используют файлы ICNS ... Никакой любви к нам, кто использует OS10.6.8 V1.1 ... это еще хуже «наш путь или шоссе» для разработчиков, чем для пользователей.
Хенрик Эрландссон,
@Anne: Это сработало ... большое спасибо! (также спасибо, что правильно задали мой вопрос). Peace, Massy
Blue
@HenrikErlandsson: Все версии Mac OS X используют файлы .icns, вплоть до 10.0.
Питер Хози
10
Должны существовать следующие файлы: 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. Файлы @ 2x должны храниться с разрешением 144 пикселя на дюйм, а остальные - с разрешением 72 пикселя на дюйм.
Carmin
285

Вот сценарий для преобразования PNG 1024x1024 (с именем «Icon1024.png») в требуемый файл icns. Сохраните его в поле с именем CreateICNS.src в папке, где находится ваш png-файл, затем на компакт-диске терминала в той же папке и введите «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
Эйдан
источник
3
Превосходно. Я поместил Icon1024.png на рабочий стол, просто запустил ваш код, и все готово
Логика
2
Возможно ли, что этот прекрасный маленький сценарий был нарушен в Эль-Капитане? Обновил мой Mac до версии 10.11.3, и теперь этот сценарий возвращает «ошибка: неподдерживаемый формат изображения», затем «/Users/IconScript/MyIcon-osx.iconset:error: вариант с именем 'icon' не содержит ресурсов изображения». затем «MyIcon-osx.iconset: ошибка: не удалось создать ICNS». Пробовал тот же сценарий и файл .png на Mac, который не обновлен до El Capitan, и он работал там, как всегда ... = (
RanLearns
1
Да @Henry, я просто удалял имена папок, чтобы попытаться очистить комментарий, я запускаю его в Терминале из папки, содержащей скрипт src и значки. Единственное, что отличается от предыдущего, - это El Capitan vs Yosemite ... Я буквально использовал скрипт перед успешным обновлением ОС, а затем сразу после обновления (в той же папке, те же команды терминала), и теперь он возвращает эту ошибку. Вы добились успеха на Эль-Капитане?
RanLearns
3
Важное примечание: имена файлов изображений значков должны начинаться с "icon_". У изображений должен быть альфа-канал. При необходимости вы можете добавить альфа-канал с помощью ImageMagick convert abc.png -define png:color-type=6 abc_with_alpha.png.
Дэвид Грейсон,
1
О, мой бог. создание электронного приложения и работа с иконками было такой головной болью. все руководства блога указывают на устаревшие онлайн-утилиты. ваш простой скрипт здесь, на stackerflow, просто сделал мне день. Спасибо!
nelsonenzo
26

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

Меньше разрешение - более размытый значок!

То есть, я imagemagickтоже люблю , но это не тот инструмент для этой задачи!

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

В соответствии с последними рекомендациями Apple по интерфейсу пользователя от 2020 года вы должны подготовить следующие 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 подготовлены, поместите их в какой-нибудь каталог с .iconsetрасширением ( Logos.iconsetнапример) и выполните следующее из Terminal:

iconutil --convert icns Logos.iconset

Если после выполнения этой команды ошибок не было, значит, все файлы были обработаны правильно, и вы получили Logos.icnsфайл в том же каталоге, содержащий все красивые четкие логотипы для вашего приложения, которые подойдут для любого современного экрана.

Нейротрансмиттер
источник
16

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

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
Зик
источник
9
Больше не поддерживается. :(
jamescampbell
13

Эти команды (введенные в Терминале) помогли мне преобразовать старый файл 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

Обновить

-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
Эйдан
источник
1
Спасибо, что показали это, благодаря этому я смог отменить icns и получить png! :)
Noitidart 08
9

Дополнительный комментарий: когда вы создаете файл .icns, вам необходимо переименовать все файлы изображений с префиксом «icon_ », иначе iconutil выйдет из строя с сообщением об ошибке: «.iconset: error: Failed to generate ICNS.» что совсем не информативно.

Bearsu
источник
7

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

ПРИМЕЧАНИЕ. Предполагается, что имя файла PNG должно иметь только 1 точку для разделения расширения, то есть xpto.png.

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

КОД:

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

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

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

source CreateICNS.src {PNG filename}

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

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

source CreateICNS.src abc.png
Тельмо Диас
источник
Потрясающие! Очень просто :) Возможно, сделайте это в .sh / script, и это еще больше :) Спасибо!
Гутемберг Рибейро,
6

Я написал сценарий 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 "$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

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

brew install imagemagick --with-librsvg

Этот сценарий сослужил мне хорошую службу.


Обновить

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

https://github.com/kindlychung/genicon

qed
источник
6

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

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

Обновить

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

#!/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
источник
4
Исходная версия проста и ее можно воспроизвести вручную в любой оболочке.
Денис Барменков 06
1
Если вы предпочитаете делать что-то вручную, вам вообще не нужен компьютер.
dardo82
5

Dead simple .png 👉 .icns

  1. Загрузите IconMaker.app - это просто .applescript не кусается
  2. Перетащите файл .png в только что созданное приложение IconMaker.app.

Дополнительная информация : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

Обновление High Sierra iconutil теперь более строго относится к размеру исходного файла .png. Подробнее об этом в сообщении в блоге после прыжка. ✌️

эонист
источник
3

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

пакет приложения не содержит значка в формате 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

Питер Хози
источник
3

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

Валекса
источник
Я не могу говорить от имени оригинального задавшего вопрос, но этот ответ - именно то, что мне нужно. Спасибо!
пестофаги
3
В документации Apple говорится: «Примечание: не используйте Icon Composer - он не может создавать файлы icns с высоким разрешением». То есть иконки @ 2x так сделать нельзя.
Clay Bridges
Icon Composer, похоже, работает нормально, он поставляется отдельно с сайта разработчиков Apple как часть пакета Graphics Tools for Xcode. Смотрите также здесь .
Michiel Kauw-A-Tjoe
3

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

#!/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
источник
Спасибо за изменение моего скрипта, теперь я даже не понимаю, зачем я использовал zsh
dardo82
1

Вот функция, в основном основанная на примере Генри (может быть полезна ~/.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
}

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

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

Создает 10 размеров от 16x16до 512x512@2x; принимает входные изображения .pngтолько в формате.

l'L'l
источник
1

Бегать iconutil -c icns Icon.iconset

Заметка

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

введите описание изображения здесь

onmyway133
источник
Почему 3x? Apple этого не требует.
Нейротрансмиттер
1

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

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

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

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

Заставьте ваш проект Xcode использовать их правильно:
сначала я удалил все свои бесплодные попытки в Xcode и зафиксировал чистую версию в репозитории git (что было бы умно, было бы сначала зафиксировать чистую версию - до того, как я отчаянно запустил значок дополнение одиссея).
Я также убедился, что в файле info.plist нет указателя, связанного с записью «файл значка», и что в моих общих настройках проекта я выбрал AppIcon для значков приложений.
Затем я добавил каталог assets.asset и в каталог ресурсов новую папку AppIcons and Launch Images для ОС.
Затем я скопировал (перетащите с нажатой опцией) из папки набора значков каждый файл изображения png в соответствующий AppIcon Spaceholder. Итак, снова я мог видеть, что происходит. Xcode действительно преобразовал это в файлы icns, или, может быть, - поскольку моя папка набора значков была получена из папки icns - форматы файлов были приняты.

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

Уве
источник
Форматирование! Ваш ответ может быть хорошим, но нечитаемым. Используйте абзацы и символы возврата каретки.
Nic3500
0

Мне это было нужно, но для CMake. Я также хотел дать ему SVG.

Вот суть: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

И код 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 - МОНИКА БЫЛА ОФИЦИАЛЬНО
источник
-1

Здравствуйте, для своих нужд я сделал каплю, которая работает только с перетаскиванием значков или значков для поиска в папке (я ограничился папками, так как поиск в томах всех значков может занять много времени). Таким образом, перетаскивая мышью, вы можете оставлять папки или приложения, все, что может содержать значок. Созданный набор значков носит имя исходного значка, он помещается в каталог «/ aaaicones» и путь к значку. Пример в папке "/ aaaicones", если вы отправите xcode.app, вы найдете "/aaaicones/Applications/xcode.app/access.iconset" и /aaaicones/Applications/xcode.app/access.icns (воссозданный значок) там будут быть текстовым файлом, в котором прослеживается полный путь к значкам, И путь к соответствующему примеру набора значков "/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
источник