Як вручну створити файли icns за допомогою iconutil?


106

Коли я перевіряю свою програму, я отримую цю помилку:

пакет програм не містить піктограми у форматі ICNS, що містить і a, 512x512і 512x512@2xзображення.

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

-bash: помилка синтаксису біля несподіваного маркера 'newline'

Мені не дуже добре з термінальними командами, тому, можливо, я щось роблю не так. Я написав:

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: Це спрацювало ... велике спасибі! (також дякую за правильне встановлення мого питання). Мир, Масси
Блакитний

@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 пікселями на дюйм.
Кармін

284

Ось сценарій для перетворення png 1024x1024 (з назвою "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

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
Так @ Генрі, я просто видаляв імена папок, щоб спробувати зробити коментар більш чистим, я запускаю його в терміналі з папки, яка містить скрипт і значки src. Єдине, що відрізняється, ніж раніше, - El Capitan vs Yosemite ... Я буквально використовував сценарій перед оновленням ОС з успіхом, а потім відразу після оновлення (у тій же папці, ті ж команди терміналу), і тепер вона повертає цю помилку. Чи мали ви успіх з цим на El Capitan?
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 до якогось високого класу відображення сітківки останніх 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

Ці команди (введені в Terminal) працювали для мене, щоб перетворити старий файл 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

9

Додатковий коментар, коли ви створюєте .icns файл, вам потрібно перейменувати всі файли зображень з префіксом "icon_ ", інакше iconutil не вдасться з повідомленням про помилку: ".iconset: error: Не вдалося створити ICNS." що зовсім не інформативно.


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


5

Я переробив сценарій @ Генрі, щоб він виглядав краще:

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

4
Оригінальна версія проста, і процес можна відтворити вручну в будь-якій оболонці.
Денис Барменков

1
Якщо ви віддаєте перевагу робити речі вручну, комп'ютер взагалі не потрібен.
dardo82

5

Мертвий простий .png 👉 .icns

  1. Завантажте IconMaker.app - Це просто .applecript не кусається
  2. Перетягніть .png на щойно створений IconMaker.app.

Більше інформації : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

Високе оновлення sierra iconutil тепер суворіше щодо розміру джерела .png. Детальніше про це у публікації в блозі після стрибка. ✌️


3

Коли я перевіряю свою програму, я отримую цю помилку:

пакет програм не містить піктограми у форматі ICNS, що містить зображення 512x512 та 512x512 @ 2x 2x.

Я не дуже добрий з командою терміналу, і, можливо, я щось роблю не так. Я написав:

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

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

У будь-якому випадку це може бути ваша проблема:

Я намагався поставити два PNG-файли (512x512 та 1024x1024) ... але я завжди отримую помилку.

Немає розміру 1024 на 1024 балів. Елемент 1024 на 1024 пікселя (що до Mountain Lion був на 1024 бали) тепер використовується для 512 на 512 балів @ 2x.

Ваш файл PNG повинен бути названий відповідним чином: icon_512x512@2x.png


3

Старіша версія Icon Composer від Apple, версія 2.2 працює чудово, ви просто відкриєте .ICNS у ній, натискаєте кнопку 1024x1024 і додаєте своє зображення.


Я не можу говорити за оригінального запитувача, але ця відповідь саме те, що мені потрібно. Дякую!
пестофаг

3
Документи Apple кажуть "Примітка. Не використовуйте Icon Composer - він не може створювати файли icns з високою роздільною здатністю." Тобто піктограми @ 2x не можна зробити так.
Clay Bridges

Ікона Composer, здається, працює добре, вона постачається окремо з сайту розробника Apple, як частина пакета Graphics Tools for Xcode. Дивіться також тут .
Мічіель Каув-А-Тхое

2

Код оболонки @ 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

Дякую за варіацію мого сценарію, тепер я навіть не впевнений, чому я використовував 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лише у форматі.


1

Біжи iconutil -c icns Icon.iconset

Примітка

  • Icon.iconset - це папка
  • Назва починається з малої літери icon_
  • Коли ви бачите Icon.icnsз правильним зображенням, ви знаєте, що це працює

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


Чому 3x? Apple цього не вимагає.
Нейромедіатор

1

Є два завдання:
- створити 10 правильних файлів icns
- отримати ваш проект Xcode, щоб правильно їх використовувати

Оскільки у мене були години довгі проблеми з обома цими завданнями, а також не люблю, коли я не "бачу", що відбувається, ось шлях для обережних:

Створіть 10 правильних файлів icns:
я використав сценарій вище від Генрі: Він як і раніше працює для HighSierra та Xcode 9.2, включаючи команду 'c'.
Файл icns, який я отримав, виявився лише одним розміром піктограми в Finder / Quicklook та в Preview показав лише 8 з 10 розмірів.
Тож я використав термінал, перейшов з компакт-диском до своєї папки і використав команду: iconutil -c iconset (ім'я файлу icns) у щойно створеному файлі icns, щоб повернути файл icns назад у папку набору іконок, і - ось і ось - я міг бачити мої новостворені 10 файлів іконок. Використовуючи Швидкий погляд на папку набір значків (і використовуючи режим повноекранного режиму, щоб мати змогу масштабувати їх за допомогою повзунка), я міг перевірити, чи всі розміри насправді виглядають дуже добре.

Як осторонь: вони виглядали краще, ніж мої спроби зміни розміру з PSE, швидше за все, тому що я не знайшов час грати зі всіма параметрами зміни розміру в PSE. Якщо ви використовуєте PSE, переконайтеся, що ваші png-файли збережені без кольорового профілю. Крім того, визнаючи своє незнання, для мене файл 256x256 @ 2 такий же, як файл 512x512 - обидва у 72dpi. Спроба слідкувати за вищевказаними коментарями 144 точок на дюйм у мене не вийшло.

Отримайте ваш проект Xcode, щоб правильно їх використовувати:
Спершу я видалив усі свої безрезультатні спроби в Xcode і здійснив чисту версію в сховищі git (що було б розумним, було б спочатку зробити чисту версію - перш ніж я відчайдушно запустив значок додаткова одисея).
Я також переконався, що у файлі info.plist немає вказівника, пов’язаного із записом 'файл файлу значків', і що в моїх загальних настройках проекту я вибрав AppIcon для іконок додатків.
Тоді я додав каталог активів.набір і в каталозі активів новий AppIcon і запуск зображень «Папка AppIcon для ОС.
Потім я скопіював (перетягування та натискання опції) із папки значків кожного png-файлу зображення у відповідний простір AppIcon. Тож я знову міг бачити, що відбувається. 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 ()

-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.