Jak ręcznie tworzyć pliki ICNS za pomocą iconutil?

107

Podczas weryfikacji mojej aplikacji pojawia się ten błąd:

pakiet aplikacji nie zawiera ikony w formacie ICNS, zawierającej zarówno a, jak 512x512i 512x512@2xobraz.

Używam do tworzenia ikon icns za pomocą aplikacji Img2icns i do dziś zawsze działało poprawnie. Ale teraz otrzymuję ten błąd i nie ma sposobu, aby to zadziałało. Próbowałem połączyć dwa pliki PNG ( 512x512i 1024x1024) w Img2icns, ale zawsze otrzymuję ten błąd. Próbowałem również postępować zgodnie z instrukcjami zawartymi w Wytycznych dotyczących interfejsu ludzkiego systemu OS X firmy Apple, ale kiedy próbuję utworzyć zestawy ikon, otrzymuję ten błąd terminala:

-bash: błąd składni w pobliżu nieoczekiwanego tokenu „nowa linia”

Nie radzę sobie zbyt dobrze z poleceniami terminala, więc może robię coś źle. Napisałem:

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

Gdyby ktoś mógł pomóc, byłby bardzo wdzięczny. Dzięki, Massy.

niebieski
źródło
I zbudowany aplikację, która otacza iconutil aby to łatwe: hobbyistsoftware.com/icontool
Confused Vorlon

Odpowiedzi:

63

Sprawdź następujące instrukcje ( link ):

Użyj iconutil, aby ręcznie utworzyć plik icns

Narzędzie iconutilwiersza polecenia konwertuje iconsetfoldery na gotowe do wdrożenia pliki ICNS o wysokiej rozdzielczości. (Pełną dokumentację tego narzędzia można znaleźć, wpisując man iconutilw Terminalu). Użycie tego narzędzia powoduje również kompresję icnspliku wynikowego , więc nie ma potrzeby wykonywania dodatkowej kompresji.

Aby przekonwertować zestaw ikon na plik icns

Wpisz to polecenie w oknie terminala:

iconutil -c icns <iconset filename>

gdzie <iconset filename>jest ścieżką do folderu zawierającego zestaw ikon, na który chcesz przekonwertować icns. Dane wyjściowe są zapisywane w tej samej lokalizacji iconset file, co plik wyjściowy, chyba że określisz plik wyjściowy, jak pokazano:

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

Innymi słowy, musisz zastąpić <iconset filename>ścieżką:

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

Ponieważ ścieżka zawiera spacje, musisz użyć podwójnych cudzysłowów, na przykład:

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

To polecenie powinno działać poprawnie.

Anne
źródło
2
iconutilJednak prawdopodobnie nie musisz go używać . Możesz po prostu dodać zestaw ikon do swojego projektu i pozwolić Xcode przekonwertować go za Ciebie w ramach kompilacji.
Omówiono
@Anne: poza tym, że polecenie iconutil jest dołączone tylko do wersji systemu operacyjnego, które nie używają plików ICNS ... Nie ma miłości dla nas, którzy używają OS10.6.8 V1.1 ... to jeszcze gorsza `` nasza droga lub autostrada '' dla deweloperów niż dla użytkowników.
Henrik Erlandsson
@Anne: To zadziałało ... wielkie dzięki! (również dziękuję za prawidłowe ustawienie mojego pytania). Peace, Massy
Blue
@HenrikErlandsson: Wszystkie wersje Mac OS X używają plików .icns, aż do 10.0.
Peter Hosey,
10
Powinny istnieć następujące pliki: icon_16x16.png, [email protected], icon_32x32.png, [email protected], icon_128x128.png, [email protected], icon_256x256.png, [email protected]. Pliki @ 2x powinny być przechowywane z rozdzielczością 144 pikseli na cal, podczas gdy inne powinny być przechowywane z szybkością 72 pikseli na cal.
karmin
286

Oto skrypt do konwersji png 1024x1024 (o nazwie „Icon1024.png”) do wymaganego pliku icns. Zapisz go w pliku o nazwie „CreateICNS.src” w folderze, w którym znajduje się Twój plik png w terminalu „cd”, w tym samym folderze i wpisz „source CreateICNS.src”, aby go nazwać:

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
Aidan
źródło
3
Wspaniały. Umieściłem Icon1024.png na pulpicie, po prostu uruchomiłem kod i zrobiłem wszystko
Logic
2
Czy to możliwe, że ten doskonały mały scenariusz został uszkodzony w El Capitan? Zaktualizowałem komputer Mac do wersji 10.11.3 i ten skrypt zwraca teraz „błąd: nieobsługiwany format obrazu”, a następnie „/Users/IconScript/MyIcon-osx.iconset:error: Wariant o nazwie„ ikona ”nie zawiera zasobów obrazu”. następnie „MyIcon-osx.iconset: błąd: nie udało się wygenerować ICNS”. Wypróbowałem ten sam skrypt i plik .png na komputerze Mac, który nie został zaktualizowany do wersji El Capitan i działał tam jak zawsze ... = (
RanLearns
1
Tak, @Henry, właśnie usuwałem nazwy folderów, aby spróbować wyczyścić komentarz, uruchamiam go w terminalu z folderu zawierającego skrypt src i ikony. Jedyną rzeczą inną niż wcześniej jest El Capitan vs Yosemite ... Dosłownie użyłem skryptu przed pomyślną aktualizacją systemu operacyjnego, a następnie zaraz po aktualizacji (w tym samym folderze, te same polecenia terminala) i teraz zwraca ten błąd. Czy odniosłeś sukces na El Capitan?
RanLearns
3
Ważne uwagi: nazwy plików obrazów ikon muszą zaczynać się od „icon_”. Obrazy muszą mieć kanał alfa. W razie potrzeby możesz dodać kanał alfa za pomocą ImageMagick convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson,
1
o mój Boże. tworzenie aplikacji electronicznej i zajmowanie się ikonami było bardzo trudne. wszystkie samouczki na blogu wskazują na przestarzałe narzędzia online. Twój prosty skrypt w stackerflow właśnie sprawił mi przyjemność. Dziękuję Ci!
nelsonenzo
26

Chociaż używanie wszelkiego rodzaju skryptów do konwersji PNGobrazu wysokiej rozdzielczości do wielu różnych kopii o niskiej rozdzielczości może wydawać się przydatne (i tak jest), nie należy zapominać, że tego rodzaju automatyczna zmiana rozmiaru spowoduje, że obrazy będą dostrzegalnie niedoskonałe .

Mniejsza rozdzielczość - bardziej rozmyta ikona!

To znaczy, ja imagemagickteż kocham , ale to nie jest odpowiednie narzędzie do tego zadania!

Zamiast tego powinieneś zawsze poprosić projektanta o logo w jakimś formacie wektorowym, na przykład w SVG. Mając to pod ręką, możesz ręcznie przygotować idealne PNGpliki we wszystkich wymaganych rozdzielczościach, a następnie utworzyć pojedynczy .icnsplik, który sprawi, że ikona Twojej aplikacji będzie wyglądać pięknie na każdym ekranie, od taniego iPhone'a SE po niektóre wysokiej klasy wyświetlacz Retina z najnowszymi iMac. Możesz użyć Photoshopa, GIMP-a lub dowolnego innego wybranego narzędzia do wygenerowania tych plików PNG.

Zgodnie z najnowszymi wytycznymi Apple dotyczącymi interfejsu użytkownika z 2020 r., Należy przygotować następujące PNGpliki:

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

Po przygotowaniu wszystkich plików PNG umieść je w jakimś katalogu z .iconsetrozszerzeniem ( Logos.iconsetna przykład) i wykonaj następujące czynności z Terminal:

iconutil --convert icns Logos.iconset

Jeśli po wykonaniu tego polecenia nie było błędów, wszystkie pliki zostały przetworzone poprawnie, a Logos.icnsplik został umieszczony w tym samym katalogu, zawierającym wszystkie piękne, wyraźne logo dla Twojej aplikacji, które będzie pasować do każdego nowoczesnego ekranu.

Neurotransmiter
źródło
16

Istnieje moduł węzła wiersza poleceń, który wykonuje całą pracę związaną z konwersją pliku PNG do katalogu zestawu ikon:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
Zeke
źródło
9
Nie jest już obsługiwany. :(
jamescampbell
13

Te polecenia (wprowadzone w Terminalu) pracowały dla mnie, aby przekonwertować stary plik icns do nowego formatu:

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

Aktualizacja

-cParametrem iconutil nie jest już obsługiwana. Użyj --convertzamiast tego:

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
Aidan
źródło
1
Dzięki za pokazanie tego, dzięki temu mogłem odwrócić się od icns, aby uzyskać png! :)
Noitidart
9

Dodatkowy komentarz, kiedy tworzysz plik .icns, musisz zmienić nazwy wszystkich plików pic z prefiksem „icon_ ”, w przeciwnym razie iconutil zakończy się niepowodzeniem z komunikatem o błędzie: „.iconset: błąd: nie udało się wygenerować ICNS”. co w ogóle nie jest pouczające.

Bearsu
źródło
7

To samo, co @Henry (komentarz powyżej), ale przyjmuje jako argument nazwę pliku PNG i wyświetla ICNS o tej samej nazwie.

UWAGA: Oczekuje się, że nazwa pliku PNG będzie miała tylko 1 punkt oddzielnego rozszerzenia, np. Xpto.png.

Zatem zapisz poniższy kod w pliku o nazwie „CreateICNS.src” w folderze, w którym znajduje się plik png.

KOD :

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

JAK UŻYWAĆ :

Następnie w terminalu „cd” do tego samego folderu i wpisz:

source CreateICNS.src {PNG filename}

gdzie {nazwa pliku PNG} to nazwa twojego pliku PNG, np. xpto.png.

Gdyby twój plik miał nazwę abc.png, użyłbyś:

source CreateICNS.src abc.png
Telmo Dias
źródło
Niesamowite! Śmiertelnie proste :) być może uczyniłoby to .sh / script jeszcze większym :) Dzięki!
Gutemberg Ribeiro
6

Napisałem skrypt bash do tworzenia icns z pliku svg:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='[email protected]'
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'     '[email protected]'
mv 'icon_64x64.png'     '[email protected]'
cp 'icon_256x256.png'   '[email protected]'
cp 'icon_512x512.png'   '[email protected]'

mkdir icon.iconset
mv icon_*x*.png icon.iconset
iconutil -c icns icon.iconset

Upewnij się, że masz zainstalowaną aplikację imagemagick z obsługą librsvg, na komputerze Mac:

brew install imagemagick --with-librsvg

Ten scenariusz dobrze mi służył.


Aktualizacja

Dla dokładniejszego potraktowania stworzyłem narzędzie wiersza poleceń (napisane w języku Swift) do generowania AppIcon.appiconsetz odpowiednim układem i formatem:

https://github.com/kindlychung/genicon

co było do okazania
źródło
6

Przereagowałem skrypt @ Henry'ego, aby wyglądał lepiej:

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

Aktualizacja

-cParametrem iconutil nie jest już obsługiwana. Użyj -—convertzamiast tego:

#!/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
źródło
4
Oryginalna wersja jest prosta i można ją odtworzyć ręcznie w dowolnej powłoce.
Denis Barmenkov
1
Jeśli wolisz robić rzeczy ręcznie, w ogóle nie potrzebujesz komputera.
dardo82,
5

Dead simple .png 👉 .icns

  1. Pobierz IconMaker.app - To po prostu plik .applescript nie gryzie
  2. Przeciągnij i upuść plik .png do właśnie utworzonego IconMaker.app.

Więcej informacji : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

Aktualizacja High Sierra iconutil jest teraz bardziej rygorystyczna co do rozmiaru źródłowego .png. Więcej o tym w poście po skoku. ✌️

eonista
źródło
3

Podczas weryfikacji mojej aplikacji pojawia się ten błąd:

pakiet aplikacji nie zawiera ikony w formacie ICNS, zawierającej zarówno obraz 512x512, jak i 512x512 @ 2x.

Nie radzę sobie zbyt dobrze z poleceniami terminala, więc może robię coś nie tak. Napisałem:

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

Po pierwsze, jak wspomniałem w komentarzu do odpowiedzi Anne, prawdopodobnie nie musisz używać iconutil. Powinieneś być w stanie po prostu dodać zestaw ikon do swojego projektu i pozwolić Xcode przekonwertować go za Ciebie jako część kompilacji.

Tak czy inaczej, może to być twój problem:

Próbowałem umieścić dwa pliki PNG razem (512x512 i 1024x1024)… ale zawsze pojawia się błąd.

Nie ma rozmiaru 1024 na 1024 punktów. Element 1024 na 1024 pikseli (który był 1024 punktów przed Mountain Lion) jest teraz używany do 512 na 512 punktów przy 2x.

Twój plik PNG musi mieć odpowiednią nazwę: [email protected]

Peter Hosey
źródło
3

Starsza wersja Apple Icon Composer 2.2 działa dobrze, wystarczy otworzyć w niej plik .ICNS, nacisnąć przycisk 1024x1024 i dodać obraz.

valexa
źródło
Nie mogę mówić do oryginalnego zapytania Asker, ale ta odpowiedź jest dokładnie to, co mi potrzebne. dzięki!
pestophagous
3
Dokumenty Apple mówią „Uwaga: nie używaj programu Icon Composer - nie można tworzyć plików ICNS o wysokiej rozdzielczości”. Oznacza to, że ikon @ 2x nie można zrobić w ten sposób.
Clay Bridges
Wydaje się, że Icon Composer działa dobrze, jest dostarczany oddzielnie ze strony programistów Apple jako część pakietu Graphics Tools for Xcode. Zobacz także tutaj .
Michiel Kauw-A-Tjoe
3

Kod powłoki @ dardo82 jest dobry i działał. Oto prostszy w sh (dla wszystkich * nix) i szybszy (jak to naprawdę ma znaczenie):

#!/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
Michael T.
źródło
Dzięki za wariację w moim skrypcie, teraz nie jestem nawet pewien, dlaczego użyłem zsh
dardo82
1

Oto funkcja oparta głównie na przykładzie Henry'ego (może być przydatna w ~/.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
}

Zastosowanie :

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

Tworzy 10 rozmiarów od 16x16do 512x512@2x; akceptuje obrazy wejściowe .pngtylko w formacie.

l'l'l
źródło
1

Biegać iconutil -c icns Icon.iconset

Uwaga

  • Icon.iconset to folder
  • Nazwa zaczyna się od małych liter icon_
  • Kiedy widzisz Icon.icnsprawidłowy obraz, wiesz, że to działa

wprowadź opis obrazu tutaj

onmyway133
źródło
Dlaczego 3x? Apple tego nie potrzebuje.
Neurotransmitter
1

Istnieją 2 zadania:
- utwórz 10 poprawnych plików icns
- spraw, aby projekt Xcode używał ich poprawnie

Ponieważ miałem godzinne problemy z obydwoma tymi zadaniami, a także nie lubię, gdy nie `` widzę '', co się dzieje, oto ścieżka dla ostrożnych:

Utwórz 10 poprawnych plików icns:
Użyłem powyższego skryptu od Henry'ego: Nadal działa on dla HighSierra i Xcode 9.2, w tym polecenie „c”.
Plik icns, który otrzymałem, pojawił się jako tylko jeden rozmiar ikony w Finderze / Quicklook, aw podglądzie pokazał tylko 8 z 10 rozmiarów.
Więc użyłem terminala, poszedłem z cd do mojego folderu i użyłem polecenia: iconutil -c iconset (nazwa pliku icns) na właśnie utworzonym pliku icns, aby przywrócić plik icns z powrotem do folderu zestawu ikon, i - lo & behold - mogłem zobaczyć moje nowo utworzone 10 plików ikon. Używając szybkiego spojrzenia na folder zestawu ikon (i używając trybu pełnoekranowego, aby móc je powiększać za pomocą suwaka), mogłem sprawdzić, czy wszystkie rozmiary wyglądają bardzo dobrze.

Na marginesie: wyglądały lepiej niż moje próby zmiany rozmiaru z PSE, najprawdopodobniej dlatego, że nie poświęciłem czasu na zabawę ze wszystkimi opcjami zmiany rozmiaru w PSE. Jeśli korzystasz z PSE, upewnij się, że pliki png są zapisywane bez profilu kolorów. Poza tym, wyznając moją ignorancję, dla mnie plik 256x256 @ 2 jest taki sam jak plik 512x512 - oba w 72dpi. Nie udało mi się zastosować się do powyższych komentarzy o rozdzielczości 144 dpi.

Uzyskaj projekt Xcode, aby używać ich poprawnie:
Najpierw usunąłem wszystkie moje bezowocne próby w Xcode i wprowadziłem czystą wersję do repozytorium git (co byłoby sprytne, byłoby najpierw zatwierdzenie czystej wersji - zanim gorączkowo uruchomiłem ikonę dodatek odyssee).
Upewniłem się również, że w pliku info.plist nie ma wskaźnika powiązanego z wpisem „plik ikon” oraz że w moich ogólnych ustawieniach projektu wybrałem AppIcon dla ikon aplikacji.
Następnie dodałem katalog asset.asset, aw katalogu zasobów nowy folder AppIcons and Launch Images „AppIcons and Launch Images” dla systemu operacyjnego.
Następnie skopiowałem (przeciągnij i upuść z wciśniętą opcją) z folderu zestawu ikon każdy plik obrazu png do odpowiedniego elementu AppIcon Spaceholder. Więc znowu mogłem zobaczyć, co się dzieje. Xcode przekonwertował to na pliki icns, a może - jako mój folder zestawu ikon pochodzący z folderu icns - formaty plików zostały zaakceptowane.

Następnie zarchiwizuj i zweryfikuj, a podczas przesyłania lub sprawdzania poprawności nie będzie żadnych błędów.

Uwe
źródło
Formatowanie! Twoja odpowiedź może być dobra, ale jest nieczytelna. Użyj akapitów i powrotu karetki.
Nic3500
0

Potrzebowałem tego, ale dla CMake. Chciałem też mieć możliwość nadania mu pliku SVG.

Oto sedno: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

Oraz kod 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 - MONICA ZOSTAŁA POMYŚLNA
źródło
-1

Witam, na moje potrzeby stworzyłem droplet, który działa w samych ikonach przeciągnij i upuść lub ikon do wyszukiwania w folderze (ograniczyłem się do folderów, ponieważ wyszukiwanie w Volumes wszystkich ikon może zająć dużo czasu). Więc przeciągnij i upuść możesz upuszczać foldery lub aplikacje, wszystko, co może zawierać ikonę. Utworzony zestaw ikon nosi nazwę oryginalnej ikony, jest umieszczony w katalogu „/ aaaicones” i ścieżka do ikony. Przykład w folderze "/ aaaicones, jeśli prześlesz xcode.app, znajdziesz" /aaaicones/Applications/xcode.app/access.iconset "i /aaaicones/Applications/xcode.app/access.icns (ikona odtworzona) być plikiem tekstowym, w którym jest śledzona pełna ścieżka ikon oraz ścieżka do odpowiedniego przykładu zestawu ikon „/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
źródło