Bagaimana cara membuat file icns secara manual menggunakan iconutil?

106

Saat saya memvalidasi aplikasi saya, saya mendapatkan kesalahan ini:

bundel aplikasi tidak berisi ikon dalam format ICNS, yang berisi a 512x512dan 512x512@2xgambar.

Saya menggunakan untuk membuat ikon icns dengan aplikasi Img2icns dan sampai hari ini selalu berfungsi dengan baik. Tapi sekarang saya mendapatkan kesalahan itu dan tidak ada cara untuk membuatnya bekerja. Saya mencoba menyatukan dua file PNG ( 512x512dan 1024x1024) di Img2icns tetapi saya selalu mendapatkan kesalahan itu. Saya juga mencoba mengikuti petunjuk di Panduan Antarmuka Manusia OS X Apple tetapi ketika saya mencoba membuat kumpulan ikon, saya mendapatkan kesalahan terminal ini:

-bash: kesalahan sintaks dekat token 'baris baru' yang tidak terduga

Saya tidak begitu baik dengan perintah terminal jadi mungkin saya melakukan sesuatu yang salah. Saya menulis:

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

Jika ada yang bisa membantu, itu akan sangat dihargai. Terima kasih, Massy.

Biru
sumber
Saya membuat aplikasi yang membungkus iconutil untuk membuatnya mudah: hobbyistsoftware.com/icontool
Confused Vorlon

Jawaban:

63

Lihat instruksi berikut ( tautan ):

Gunakan iconutil untuk Membuat File icns Secara Manual

The iconutilalat baris perintah bertobat iconsetfolder untuk, resolusi tinggi penyebaran-siap ICNS file. (Anda dapat menemukan dokumentasi lengkap untuk alat ini dengan masuk man iconutilke Terminal.) Menggunakan alat ini juga memampatkan hasilicns file yang , jadi Anda tidak perlu melakukan kompresi tambahan.

Untuk mengonversi sekumpulan ikon menjadi file icns

Masukkan perintah ini ke jendela Terminal:

iconutil -c icns <iconset filename>

di mana <iconset filename>jalur ke folder yang berisi kumpulan ikon yang ingin Anda ubah icns. Keluaran ditulis ke lokasi yang sama dengan iconset file, kecuali Anda menentukan file keluaran seperti yang ditunjukkan:

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

Dengan kata lain, Anda perlu mengganti <iconset filename>dengan jalur:

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

Karena jalur berisi spasi, Anda perlu menggunakan tanda kutip ganda, misalnya:

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

Perintah ini harus bekerja dengan baik.

Anne
sumber
2
Anda mungkin tidak perlu menggunakan iconutil. Anda cukup menambahkan kumpulan ikon ke proyek Anda dan membiarkan Xcode mengonversinya untuk Anda sebagai bagian dari pembuatan. Itu tercakup dalam bagian sebelumnya (sangat singkat): developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Peter Hosey
@Anne: kecuali perintah iconutil hanya disertakan dengan versi OS yang tidak menggunakan file ICNS ... Tidak ada cinta untuk kami yang menggunakan OS10.6.8 V1.1 ... ini bahkan lebih buruk 'jalan atau jalan raya' untuk pengembang daripada pengguna.
Henrik Erlandsson
@Anne: Itu berhasil ... terima kasih banyak! (juga terima kasih telah menyetel pertanyaan saya dengan benar). Peace, Massy
Blue
@HenrikErlandsson: Semua versi Mac OS X menggunakan file .icns, kembali ke 10.0.
Peter Hosey
10
File berikut harus ada: icon_16x16.png, [email protected], icon_32x32.png, [email protected], icon_128x128.png, [email protected], icon_256x256.png, [email protected] File @ 2x harus disimpan pada 144 piksel per inci sementara yang lain harus disimpan pada 72 piksel per inci.
carmin
284

Berikut skrip untuk mengubah png 1024x1024 (bernama "Icon1024.png") ke file icns yang diperlukan. Simpan ke file bernama "CreateICNS.src" di folder tempat file png Anda kemudian di terminal "cd" ke folder yang sama dan ketik "sumber CreateICNS.src" untuk memanggilnya:

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
sumber
3
Hebat. saya meletakkan Icon1024.png di desktop, dan jalankan saja kode Anda dan semuanya selesai
Logika
2
Mungkinkah naskah kecil yang sempurna ini telah rusak di El Capitan? Meningkatkan Mac saya ke 10.11.3 dan skrip ini sekarang mengembalikan "kesalahan: Format gambar yang tidak didukung" lalu "/Users/IconScript/MyIcon-osx.iconset:error: Varian bernama 'icon' tidak mengandung sumber gambar." lalu "MyIcon-osx.iconset: error: Gagal membuat ICNS." Mencoba skrip dan file .png yang sama di Mac yang tidak diperbarui ke El Capitan dan berfungsi di sana seperti biasa ... = (
RanLearns
1
Ya @Henry, saya baru saja menghapus nama folder untuk mencoba dan membuat komentar lebih bersih, saya menjalankannya di Terminal dari dalam folder yang berisi skrip dan ikon src. Satu-satunya hal yang berbeda dari sebelumnya adalah El Capitan vs Yosemite ... Saya benar-benar menggunakan skrip sebelum memperbarui OS dengan sukses dan kemudian segera setelah memperbarui (di folder yang sama, perintah Terminal yang sama) dan sekarang mengembalikan kesalahan itu. Apakah Anda berhasil melakukannya di El Capitan?
RanLearns
3
Hal penting untuk diperhatikan: Nama file gambar ikon Anda harus dimulai dengan "icon_". Gambar harus memiliki saluran alfa. Anda dapat menambahkan saluran alfa dengan ImageMagick jika diperlukan convert abc.png -define png:color-type=6 abc_with_alpha.png.
David Grayson
1
Oh Tuhan. membangun aplikasi elektron dan berurusan dengan ikon sangat merepotkan. semua tutorial blog mengarah ke utilitas online yang sudah ketinggalan zaman. skrip sederhana Anda di sini di stackerflow baru saja membuat hari saya menyenangkan. Terima kasih!
nelsonenzo
26

Meskipun menggunakan semua jenis skrip untuk mengonversi PNGgambar resolusi tinggi menjadi salinan resolusi rendah yang berbeda mungkin tampak berguna (dan memang demikian), orang tidak boleh lupa bahwa jenis pengubahan ukuran otomatis ini akan membuat gambar yang tampak tidak sempurna .

Kurangi resolusinya - buram ikonnya!

Maksud saya, saya imagemagickjuga suka , tetapi ini bukan alat yang tepat untuk tugas ini!

Sebaliknya, Anda harus selalu meminta logo dalam beberapa format vektor dari desainer Anda, misalnya dalam format SVG. Dengan ini, Anda dapat secara manual menyiapkan PNGfile yang sempurna dalam semua resolusi yang diperlukan dan kemudian membuatnya.icns file, yang akan membuat ikon aplikasi Anda terlihat cantik di setiap layar, dari iPhone SE yang murah hingga tampilan Retina kelas atas yang terbaru. iMac. Anda dapat menggunakan Photoshop, GIMP atau alat lain pilihan Anda untuk menghasilkan PNG ini.

Dari Panduan Antarmuka Manusia Apple terbaru tahun 2020, Anda harus menyiapkan PNGfile - file berikut :

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

Setelah semua file PNG disiapkan, letakkan ke dalam beberapa direktori dengan .iconsetekstensi ( Logos.iconsetmisalnya) dan jalankan yang berikut ini dari Terminal:

iconutil --convert icns Logos.iconset

Jika tidak ada kesalahan setelah menjalankan perintah ini, maka semua file diproses dengan benar, dan Anda mendapatkan Logos.icnsfile di direktori yang sama, yang berisi semua logo tajam yang indah untuk aplikasi Anda yang sesuai dengan layar modern mana pun.

Neurotransmitter
sumber
16

Ada modul node baris perintah yang melakukan semua pekerjaan untuk mengubah file PNG menjadi direktori iconset:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
Zeke
sumber
9
Tidak lagi didukung. :(
jamescampbell
13

Perintah-perintah ini (dimasukkan di Terminal) berfungsi untuk saya mengonversi file icns lama ke format baru:

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

Memperbarui

The -cparameter untuk iconutil tidak lagi didukung. Gunakan --convertsebagai gantinya:

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
sumber
1
Terima kasih telah menunjukkan ini, berkat ini saya bisa membalikkan dari icns untuk mendapatkan png! :)
Noitidart
9

Komentar tambahan, ketika Anda membuat file .icns, Anda perlu mengganti nama semua file pic dengan awalan "icon_ ", jika tidak, iconutil akan gagal dengan pesan kesalahan: ".iconset: error: Gagal membuat ICNS." yang tidak informatif sama sekali.

Bearsu
sumber
7

Sama seperti @Henry (komentar di atas) tetapi menganggap nama file PNG sebagai argumen dan mengeluarkan ICNS dengan nama yang sama.

CATATAN: Nama file PNG diharapkan hanya memiliki 1 titik untuk memisahkan ekstensi, yaitu xpto.png.

Jadi, simpan kode di bawah ini ke file bernama "CreateICNS.src" di folder tempat file png Anda berada.

KODE:

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

CARA PENGGUNAAN :

Kemudian di terminal, "cd" ke folder dan ketik yang sama:

source CreateICNS.src {PNG filename}

dengan {PNG filename} adalah nama file PNG Anda, yaitu xpto.png.

Jika file Anda akan dinamai abc.png, Anda akan menggunakan:

source CreateICNS.src abc.png
Telmo Dias
sumber
Hebat! Sangat sederhana :) mungkin membuatnya menjadi .sh / script akan membuatnya lebih :) Terima kasih!
Gutemberg Ribeiro
6

Saya telah menulis skrip bash untuk membuat icns dari file 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

Pastikan Anda telah menginstal imagemagick dengan dukungan librsvg, di mac:

brew install imagemagick --with-librsvg

Skrip ini telah membantu saya dengan cukup baik.


Memperbarui

Untuk perawatan yang lebih menyeluruh, saya telah membuat alat baris perintah (ditulis dalam Swift) untuk menghasilkan AppIcon.appiconsetdengan tata letak dan format yang benar:

https://github.com/kindlychung/genicon

qed
sumber
5

Saya telah merefaktor ulang skrip @ Henry agar terlihat lebih baik:

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

Memperbarui

The -cparameter untuk iconutil tidak lagi didukung. Gunakan -—convertsebagai gantinya:

#!/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
sumber
4
Versi aslinya sederhana dan seseorang dapat mereproduksi proses secara manual di shell manapun.
Denis Barmenkov
1
Jika Anda lebih suka melakukan sesuatu secara manual, Anda tidak memerlukan komputer sama sekali.
dardo82
5

Mati sederhana .png 👉 .icns

  1. Unduh IconMaker.app - Ini hanya .applescript tidak akan menggigit
  2. Seret dan lepas .png Anda ke IconMaker.app yang baru saja Anda buat.

Info lebih lanjut : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

Pembaruan sierra tinggi iconutil sekarang lebih ketat tentang ukuran sumber .png. Lebih lanjut tentang ini di posting blog setelah lompat. ✌️

eonist
sumber
3

Saat saya memvalidasi aplikasi saya, saya mendapatkan kesalahan ini:

bundel aplikasi tidak berisi ikon dalam format ICNS, yang berisi gambar 512x512 dan 512x512 @ 2x.

Saya tidak begitu baik dengan perintah terminal dan mungkin saya melakukan sesuatu yang salah. Saya menulis:

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

Untuk satu hal, seperti yang saya sebutkan dalam komentar di jawaban Anne, Anda mungkin tidak perlu menggunakan iconutil. Anda seharusnya dapat menambahkan kumpulan ikon ke proyek Anda dan membiarkan Xcode mengonversinya untuk Anda sebagai bagian dari pembuatan.

Bagaimanapun, ini mungkin masalah Anda:

Saya mencoba untuk meletakkan dua file PNG togheter (512x512 dan 1024x1024)… tetapi saya selalu mendapatkan error.

Tidak ada ukuran poin 1024 x 1024. Elemen 1024 x 1024 piksel (yang sebelumnya 1024 poin sebelum Mountain Lion) sekarang digunakan untuk 512 x 512 poin @ 2x.

File PNG Anda harus diberi nama yang sesuai: [email protected]

Peter Hosey
sumber
3

Icon Composer versi 2.2 Apple yang lebih lama bekerja dengan baik, Anda cukup membuka .ICNS di dalamnya, tekan tombol 1024x1024 dan tambahkan gambar Anda.

valexa.dll
sumber
saya tidak dapat berbicara untuk penanya yang asli, tetapi jawaban ini persis seperti yang saya butuhkan. Terima kasih!
pestophagous
3
Dokumen Apple mengatakan "Catatan: Jangan gunakan Komposer Ikon — tidak dapat membuat file icns resolusi tinggi.". Artinya, ikon @ 2x tidak dapat dilakukan seperti itu.
Clay Bridges
Komposer Ikon tampaknya berfungsi dengan baik, itu dikirim secara terpisah dari situs pengembang Apple sebagai bagian dari paket Alat Grafik untuk Xcode. Lihat juga di sini .
Michiel Kauw-A-Tjoe
2

Kode shell @ dardo82 bagus & berfungsi. Berikut ini yang lebih sederhana di sh (untuk semua * nix) dan lebih cepat (seperti itu sangat penting):

#!/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
sumber
Terima kasih atas variasi pada skrip saya, sekarang saya bahkan tidak yakin mengapa saya menggunakan zsh
dardo82
1

Berikut adalah fungsi yang sebagian besar didasarkan pada contoh Henry (dapat berguna dalam ~/.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
}

Penggunaan :

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

Membuat 10 ukuran dari 16x16sampai 512x512@2x; menerima gambar masukan dalam .pngformat saja.

l'L'l
sumber
1

Lari iconutil -c icns Icon.iconset

Catatan

  • Icon.iconset adalah sebuah folder
  • Nama dimulai dengan huruf kecil icon_
  • Ketika Anda melihat Icon.icnsdengan gambar yang benar, Anda tahu itu berhasil

masukkan deskripsi gambar di sini

onmyway133
sumber
Kenapa 3x? Apple tidak membutuhkannya.
Neurotransmitter
1

Ada 2 tugas:
- membuat 10 file icns yang benar
- dapatkan proyek Xcode Anda untuk menggunakannya dengan benar

Karena saya memiliki masalah selama berjam-jam dengan kedua tugas ini, dan juga tidak suka ketika saya tidak 'melihat' apa yang sedang terjadi, berikut jalan untuk yang berhati-hati:

Buat 10 file icns yang benar:
Saya menggunakan skrip di atas dari Henry: Ini masih berfungsi untuk HighSierra dan Xcode 9.2, termasuk perintah 'c'.
File icns yang saya dapatkan, muncul hanya sebagai satu ukuran ikon di Finder / Quicklook dan di Pratinjau hanya menunjukkan 8 dari 10 ukuran.
Jadi saya menggunakan terminal, pergi dengan cd ke folder saya dan menggunakan perintah: iconutil -c iconset (nama file icns) pada file icns yang baru saja dibuat untuk mengembalikan file icns kembali ke folder iconset, dan - lihat & lihat - saya bisa melihat 10 file ikon saya yang baru dibuat. Dengan menggunakan Quick look pada folder iconset (dan menggunakan mode layar penuh untuk memperbesarnya dengan slider), saya dapat memeriksa bahwa semua ukuran sebenarnya terlihat sangat baik.

Selain itu: mereka terlihat lebih baik daripada upaya mengubah ukuran saya dengan PSE, kemungkinan besar karena saya tidak meluangkan waktu untuk bermain dengan semua opsi pengubahan ukuran di PSE. Jika Anda menggunakan PSE, pastikan file png Anda disimpan tanpa profil warna. Juga, mengakui ketidaktahuan saya, bagi saya file 256x256 @ 2 sama dengan file 512x512 - keduanya dalam 72dpi. Mencoba mengikuti komentar 144 dpi di atas tidak berhasil untuk saya.

Dapatkan proyek Xcode Anda untuk menggunakannya dengan benar:
Pertama saya menghapus semua upaya sia-sia saya dalam Xcode dan melakukan versi bersih ke repositori git (yang akan lebih pintar, akan menjadi versi bersih terlebih dahulu - sebelum saya dengan panik memulai ikon Selain odyssee).
Saya juga memastikan bahwa di file info.plist tidak ada penunjuk yang ditautkan ke entri 'file ikon' dan bahwa dalam pengaturan proyek umum saya, saya telah memilih AppIcon untuk Ikon Aplikasi. Kemudian saya menyalin (seret dan lepas dengan opsi ditekan) dari folder iconset setiap file gambar png ke AppIcon Spaceholder masing-masing. Jadi sekali lagi, saya bisa melihat apa yang terjadi. Xcode memang mengubahnya menjadi file icns, atau mungkin - karena folder iconset saya berasal dari folder icns - format file diterima.
Kemudian saya menambahkan katalog aset.aset dan di dalam katalog aset, Folder AppIcon 'AppIcons and Launch Images' baru untuk OS.

Kemudian arsipkan dan validasi dan tidak akan ada kesalahan saat mengupload atau memvalidasi.

Uwe
sumber
Memformat! Jawaban Anda mungkin bagus, tetapi tidak terbaca. Gunakan paragraf dan carriage return.
Nic3500
0

Saya membutuhkan ini, tetapi untuk CMake. Saya juga menginginkan opsi untuk memberinya SVG.

Inilah intinya: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

Dan kode 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 SALAH
sumber
-1

Halo, untuk kebutuhan saya, saya membuat tetesan yang berfungsi dalam ikon seret dan lepas saja atau ikon untuk mencari di folder (saya terbatas pada folder karena pencarian di Volume semua ikon dapat memakan banyak waktu). Jadi di drag and drop Anda bisa drop folder atau aplikasi apa saja yang bisa berisi icon. Kumpulan ikon yang dibuat menggunakan nama ikon asli, ditempatkan di direktori "/ aaaicones" dan jalur ikon. Contoh di folder "/ aaaicones jika Anda mengirimkan xcode.app Anda akan menemukan" /aaaicones/Applications/xcode.app/access.iconset "dan /aaaicones/Applications/xcode.app/access.icns (ikon yang dibuat ulang) di sana akan menjadi file teks di mana ia ditelusuri jalur lengkap ikon, Dan jalur ke contoh iconset terkait "/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
sumber