Automator: извлечение иконок приложений с сохранением в PNG-файлах

Зачем могут понадобиться иконки установленных приложений? Например, для красоты и наглядности в какой-нибудь презентации. Или в дизайнерской работе для создания, скажем, печатной продукции. Или в программистских делах для создания программ-твикеров или еще чего-нибудь этакого. Или просто для аватарки, если у вас есть любимая программа и вы ассоциируете себя с ней. В общем, извлечение программных пиктограм — задача не такая и специфическая. И справиться с ней проще простого.

Хозяйке на заметку. Иконки приложений в OS X можно выковырять вручную — делается это достаточно просто. Сначала выделяете приложение в окне Finder, затем жмете клавиши command+I — в окне свойств программы, щелкаете на ее значке в самом верху и жмете клавиши копирования command+C. Потом остается запустить утилиту «Просмотр» (Preview), нажать клавиши command+N и сохранить полученную картинку, желательно в формате PNG (если нужно сохранить полупрозрачные области иконки). Естественно, так удобно делать, если нужно извлечь одну-две иконки. Если же число требуемых значков гораздо больше — лучше все-таки воспользоваться возможностями «Автоматора».

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

Итак, запускайте Automator, выбирайте пункт Служба (Service) в качестве типа нашего будущего процесса. В шапке, в выпадающем списке Служба получает выбранные (Service receives selected) выберите пункт файлы или папки (files or folders), а в списке рядом выберите приложение Finder. Таким образом мы ввели ограничение: наша служба будет доступна через контекстное меню только для папок и файлов и только в программе Finder — в любых других ситуациях соответствующий пункт меню виден не будет.

Теперь начнем составлять последовательность действий нашей службы.

1. Из категории библиотеки Файлы и папки (Files and Folders) перетащите действие Фильтровать объекты Finder (Filter Finder Objects). Внутри этого действия составьте правило фильтрования Тип — совпадает с — программа (Kind — is — application). Так мы отсеем все файлы и объекты, которые случайно затесались среди выделенных программ, но программами при этом не являются.

2. Теперь из категории Утилиты (Utilities) добавьте действие Запустить AppleScript (Run AppleScript), введя в этом действии такой код:
on run {input, parameters}
activate
return input
end run

Хозяйке на заметку. Действие Запустить AppleScript с таким кодом выполняет простую, но очень важную задачу: делает текущую службу активной, выводя ее окна на передний план. По какой-то причине это не происходит автоматически: допустим, следующим действием нашей службы будет отображение диалога открытия каталога — без выполнения указанного AppleScript-кода этот диалог может затеряться среди других открытых окон, что затруднит работу со службой. Попробуйте поэкспериментировать, отключив действие Запустить AppleScript и посмотрев, как при этом служба будет себя вести. Отсюда совет: если вы хотите гарантировать, что какое-либо диалоговое окно, созданное вашей службой, сразу оказывалось поверх остальных окон, применяйте действие Запустить AppleScript с таким кодом.

3. Третье действие — Запросить объекты Finder (Ask for Finder Items) из категории Файлы и папки (Files and Folders). С его помощью мы сможем впоследствии выбрать папку, куда службе следует сохранить извлеченные иконки. В свойствах действия укажите заголовок диалогового окна выбора каталога, задайте стартовую папку и укажите тип принимаемых данных — в соответствующем выпадающем списке выберите пункт Папки.

4. Теперь добавим в службу «интеллектуальное ядро» — действие Запустить shell-скрипт (Run Shell Script). Не меняя изначальных параметров действия, введите внутрь него такой код:
INPUT=("$@")
INPUTAPPS=("${INPUT[@]:0:($#-1)}")
DESTINATION=${INPUT[($#-1)]}</p>

for APP in "${INPUTAPPS[@]}"
do
ICON=`defaults read "$APP/Contents/Info" CFBundleIconFile|sed -e 's/.icns$//'`
ICONFILE="$APP/Contents/Resources/$ICON.icns"
APPNAME=`basename "$APP" .app`
OUTFILE="$DESTINATION/${APPNAME}.png"

/usr/bin/sips -s format png "$ICONFILE" --out "$OUTFILE"
done


Если кому-нибудь интересно, в комментариях я смогу объяснить работу этого кода. Именно он получает на входе весь массив данных, отделяет пути выделенных в Файндере программ и путь к папке сохранения иконок, ищет внутри каждой программы иконку и сохраняет ее в указанном месте в формате PNG, присваивая картинкам имена соответствующих программ.

5. Если у вас установлена система визуального оповещения Growl, можно добавить последнее, пятое действие — Show Growl Notification, расположенное в категории Утилиты (Utilities). Введите заголовок (Title) и сообщение (Description), чтобы создаваемая служба могла наглядно сообщить об своем успешном выполнении.

Примерно так должна выглядеть готовая служба для извлечения иконок в русскоязычном варианте.

Все! Остается только сохранить службу под удобным для вас названием — например, Извлечь иконки из программ — и испытать ее в действии. Открыв окно Finder, перейдите в папку Программы (Applications), выделите несколько программ и, щелкнув на выделенных объектах правой кнопкой мыши, выберите в контекстном меню команду с названием только что сохраненной службы. Спустя несколько мгновений файлы будут сохранены в указанном месте, а Growl отобразит созданное вами сообщение.
*Деятельность Meta Platforms Inc. и принадлежащих ей социальных сетей Facebook и Instagram запрещена на территории РФ.

Это упрощённая версия страницы.

Читать полную версию
Если нашли ошибку, выделите текст и нажмите Ctrl + Enter
Akurganow
05.09.12 17:58
Не работает, все делал точно по описанию, у меня выглядит так http://d.pr/i/iEFR
Akurganow
05.09.12 21:08
Понял, ввод в shell-скрипт нужно передавать как аргументы, а у меня по-умолчанию стояло в stdin
Alexander Zhurovich
06.09.12 19:22
Да, все правильно. :)