如何使用iconutil手动创建icns文件?


106

当我验证我的应用程序时,出现以下错误:

该应用程序包不包含ICNS格式的图标,同时包含512x512512x512@2x

我曾经使用Img2icns应用制作icns图标,直到今天它始终可以正常工作。但是现在我得到了这个错误,没有办法使它起作用。我试图将两个PNG文件(512x5121024x1024)放到Img2icns中,但是我总是收到该错误。我还尝试遵循Apple OS X人机界面指南中的说明,但是当我尝试制作图标集时,出现此终端错误:

-bash:意外令牌“ newline”附近的语法错误

我对终端命令不是很好,所以也许我做错了什么。我写:

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

如果有人可以帮助,将不胜感激。谢谢,马西。


我内置它包装iconutil一个应用程序,使这个简单:hobbyistsoftware.com/icontool
困惑Vorlon

Answers:


63

请查看以下说明(链接):

使用iconutil手动创建icns文件

iconutil命令行工具转换iconset文件夹部署就绪,高分辨率的谘询网络文件。(您可以通过man iconutil在Terminal中输入来找到该工具的完整文档。)使用此工具还可以压缩生成的icns文件,因此无需执行其他压缩。

要将一组图标转换为icns文件

在“终端”窗口中输入以下命令:

iconutil -c icns <iconset filename>

其中<iconset filename>包含要转换为的图标集的文件夹的路径在哪里icnsiconset 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/...
彼得Hosey

@Anne:除了iconutil命令仅包含在不使用ICNS文件的OS版本中...对使用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像素存储。
carmin 2013年

284

这是将1024x1024 png(名为“ Icon1024.png”)转换为所需icns文件的脚本。将其保存到您的png文件所在的文件夹中的名为“ CreateICNS.src”的文件中,然后在终端“ 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
这个完美的小脚本有可能在El Capitan中被打破吗?将Mac升级到10.11.3,此脚本现在返回“错误:未支持的图像格式”,然后返回“ /Users/IconScript/MyIcon-osx.iconset:错误:名为'icon'的变体不包含任何图像资源。” 然后出现“ MyIcon-osx.iconset:error:无法生成ICNS。” 在未更新为El Capitan的Mac上尝试了相同的脚本和.png文件,该文件和往常一样在那里工作... =(
RanLearns 2016年

1
是的,@ Henry,我只是删除文件夹名称以尝试使注释更整洁,我在终端中从包含src脚本和图标的文件夹中运行它。与以前唯一不同的是El Capitan vs Yosemite ...我确实在成功更新OS之前使用了脚本,然后在更新之后立即使用了该脚本(在同一文件夹中,使用相同的Terminal命令),现在它返回该错误。您在El Capitan上取得了成功吗?
RanLearn '16

3
要注意的重要事项:图标图像的文件名必须以“ icon_”开头。图像必须具有Alpha通道。如果需要,可以使用ImageMagick添加Alpha通道convert abc.png -define png:color-type=6 abc_with_alpha.png
大卫·格雷森

1
我的天啊。开发电子应用程序和处理图标真是太痛苦了。所有博客教程都指向过时的在线实用程序。您在stackerflow上使用的简单脚本让我很高兴。谢谢!
nelsonenzo

26

尽管使用各种脚本将高分辨率PNG图像转换为大量不同的低分辨率副本似乎很方便(的确如此),但请不要忘记,这种自动调整大小会渲染出不完美的图像

分辨率越低-图标越模糊!

我是说,我爱 imagemagick,但这不是完成此任务的正确工具!

相反,您应始终向设计者索取某种矢量格式的徽标,例如中的SVG。使用此功能,您可以手动准备PNG所有所需分辨率的完美文件,然后制作一个.icns文件,这将使您的应用程序图标在每个屏幕上看起来都很漂亮,从廉价的iPhone SE到最新的高端Retina显示屏iMac。您可以使用Photoshop,GIMP或您选择的任何其他工具来生成这些PNG。

根据截至2020 年的最新Apple人机界面指南,您应该准备以下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文件转换为iconset目录的所有工作:

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。

因此,将以下代码保存到png文件所在的文件夹中的“ CreateICNS.src”文件中。

代码:

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会使它更多:)谢谢!
Gutemberg Ribeiro

6

我已经写了一个bash脚本,用于从svg文件制作icns:

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

确保在Mac上安装了具有librsvg支持的imagemagick:

brew install imagemagick --with-librsvg

这个脚本对我很好。


更新资料

为了进行更彻底的处理,我创建了一个命令行工具(用Swift编写),用于AppIcon.appiconset以正确的布局和格式进行生成:

https://github.com/kindlychung/genicon


5

我重构了@Henry的脚本,使其看起来更好:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

更新资料

-c不再支持iconutil 的参数。使用-—convert来代替:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR

4
原始版本很简单,可以在任何shell中手动复制该过程。
Denis Barmenkov '17

1
如果您喜欢手动处理,则完全不需要计算机。
dardo82


3

当我验证我的应用程序时,出现以下错误:

该应用程序包不包含ICNS格式的图标,该图标同时包含512x512和512x512 @ 2x图像。

我对终端命令不是很好,所以也许我做错了什么。我写:

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

一方面,正如我在对Anne的答案的评论中提到的那样,您可能不需要使用iconutil。您应该能够只将图标集添加到项目中,并让Xcode在构建过程中为您进行转换。

无论哪种方式,这都可能是您的问题:

我试图将两个PNG文件放在一起(512x512和1024x1024)…但是我总是收到错误消息。

没有1024 x 1024点大小。现在将1024 x 1024像素元素(在Mountain Lion之前为1024点)用于512 x 512点@ 2x。

您的PNG文件必须正确命名:icon_512x512@2x.png


3

Apple的旧版Icon Composer 2.2版可以正常工作,您只需在其中打开.ICNS,然后按1024x1024按钮并添加图像即可。


我不能代表最初的提问者,但是这个答案正是所需要的。谢谢!
2013年

3
苹果文档说:“注意:请勿使用Icon Composer,它无法创建高分辨率的icns文件。”。也就是说,@ 2x图标不能那样做。
粘土桥

Icon Composer似乎运行良好,它是作为Xcode图形工具包的一部分从Apple开发人员站点单独发货的。另请参阅此处
Michiel Kauw-A-Tjoe 2014年

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

这是一个主要基于亨利Henry)示例的函数(可能对有用~/.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

创建从16x16到的10种尺寸512x512@2x.png仅接受格式的输入图像 。


1

iconutil -c icns Icon.iconset

注意

  • Icon.iconset是一个文件夹
  • 名称以小写字母开头 icon_
  • 当您看到Icon.icns正确的图像时,就知道它有效

在此处输入图片说明


为什么3x呢 苹果不需要它。
神经递质

1

有2个任务:
-创建10个正确的icns文件
-让您的Xcode项目正确使用它们

由于我在这两个任务上都花了一个小时的时间,而且我不喜欢什么时候我不“看到”发生了什么,因此这里是谨慎的方法:

创建10个正确的
icns 文件:我使用了亨利上面的脚本:仍然适用于HighSierra和Xcode 9.2,包括“ c”命令。
我得到的icns文件在Finder / Quicklook中仅显示一个图标大小,而在Preview中仅显示10个大小中的8个。
因此,我使用了终端,将cd放到了我的文件夹中,并使用了以下命令:在刚刚创建的icns文件上使用iconutil -c iconset(icns文件名)将icns文件还原回了iconset文件夹,并且-看吧-我可以看到我新创建的10个图标文件。使用iconset文件夹上的Quick look(并使用全屏模式可以使用滑块缩放它们),我可以检查所有尺寸是否看起来都很好。

顺便说一句:它们看起来比我对PSE进行调整大小的尝试要好,这很可能是因为我没有花时间去研究PSE中的所有调整大小选项。如果您确实使用PSE,请确保保存的png文件没有颜色配置文件。同样,承认我的无知,对我来说,一个256x256 @ 2的文件与一个512x512的文件相同-两者均为72dpi。尝试遵循上面的144 dpi注释对我不起作用。

让您的Xcode项目正确使用它们:
首先,我删除了Xcode中所有无效的尝试,并将一个干净的版本提交给git存储库(本来很聪明,应该首先提交一个干净的版本-在我疯狂启动图标之前另外的冒险之旅)。
我还确保在info.plist文件中没有链接到“ icon file”条目的指针,并且在我的“常规”项目设置中,我已选择“ AppIcon for App Icons”。
然后,我添加了asset.asset目录,并在资产目录内添加了一个新的“ AppIcons和启动映像” AppIcon文件夹,用于OS。
然后,我从iconset文件夹中复制(拖放并按下选项)每个png图片文件到各自的AppIcon Spaceholder中。再说一次,我可以看到发生了什么。Xcode确实将其转换为icns文件,或者-作为我从icns文件夹派生的iconset文件夹,文件格式被接受了。

然后存档并验证,上传或验证时将没有错误。


格式化!您的答案可能不错,但难以理解。使用段落和回车。
Nic3500 '18

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.