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

Posted

技术标签:

【中文标题】如何使用 iconutil 手动创建 icns 文件?【英文标题】:How to manually create icns files using iconutil? 【发布时间】:2012-08-31 15:15:45 【问题描述】:

当我验证我的应用时,我收到了这个错误:

应用程序包不包含 ICNS 格式的图标,其中包含 512x512512x512@2x 图像。

我以前用Img2icns 应用程序制作icns 图标,直到今天它一直正常工作。但是现在我遇到了这个错误,没有办法让它工作。我试图将两个 PNG 文件(512x5121024x1024)放在Img2icns 中,但我总是会收到该错误。我还尝试按照 Apple 的 OS X 人机界面指南中的说明进行操作,但是当我尝试制作图标集时,我得到了这个终端错误:

-bash:意外标记“换行符”附近的语法错误

我不太擅长终端命令,所以也许我做错了什么。我写道:

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

如果有人能提供帮助,将不胜感激。谢谢,马西。

【问题讨论】:

我构建了一个包含 iconutil 的应用程序来简化此操作:hobbyistsoftware.com/icontool 【参考方案1】:

这是一个将 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

【讨论】:

好极了。我把 Icon1024.png 放在桌面上,然后运行你的代码就完成了 这个完美的小脚本有没有可能在 El Capitan 中被破解?将我的 Mac 升级到 10.11.3,此脚本现在返回“错误:不支持的图像格式”,然后返回“/Users/IconScript/MyIcon-osx.iconset:error:名为 'icon' 的变体不包含图像资源。”然后“MyIcon-osx.iconset:错误:无法生成 ICNS。”在未更新到 El Capitan 的 Mac 上尝试了相同的脚本和 .png 文件,它一如既往地在那里工作... =( 需要注意的重要事项:您的图标图像文件名必须以“icon_”开头。图像必须具有 Alpha 通道。如果需要,您可以使用 ImageMagick 添加 Alpha 通道convert abc.png -define png:color-type=6 abc_with_alpha.png 天啊。构建一个电子应用程序和处理图标是一件很痛苦的事情。所有博客教程都指向过时的在线实用程序。你在 stackerflow 上的简单脚本让我很开心。谢谢! 如果有人想知道,这些尺寸仍然是最新的:developer.apple.com/design/human-interface-guidelines/macos/…【参考方案2】:

查看以下说明 (link):

使用iconutil手动创建icns文件

iconutil 命令行工具将 iconset 文件夹转换为可部署的高分辨率 icns 文件。 (您可以通过在终端中输入 man iconutil 找到此工具的完整文档。)使用此工具还会压缩生成的 icns 文件,因此您无需执行额外的压缩。

将一组图标转换为 icns 文件

在终端窗口中输入此命令:

iconutil -c icns &lt;iconset filename&gt;

其中&lt;iconset filename&gt; 是包含要转换为icns 的图标集的文件夹的路径。输出将写入与iconset file 相同的位置,除非您指定输出文件,如下所示:

iconutil -c icns -o &lt;icon filename&gt; &lt;iconset filename&gt;

也就是说,需要将&lt;iconset filename&gt;替换为路径:

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

由于路径中包含空格,所以需要使用双引号,例如:

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

这个命令应该可以正常工作。

【讨论】:

不过,您可能不需要使用iconutil。您可以将图标集添加到您的项目中,并让 Xcode 为您转换它作为构建的一部分。这在上一个(非常短的)部分中进行了介绍:developer.apple.com/library/mac/documentation/GraphicsAnimation/… @Anne:除了 iconutil 命令只包含在不使用 ICNS 文件的操作系统版本中...不喜欢使用 OS10.6.8 V1.1 的我们...这是一个偶数对于开发人员来说,“我们的方式或高速公路”比用户更糟糕。 @Anne:这行得通……非常感谢! (也感谢您正确设置我的问题)。和平,马西 @HenrikErlandsson:所有版本的 Mac OS X 都使用 .icns 文件,一直到 10.0。 以下文件应该存在: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 像素存储。【参考方案3】:

虽然使用各种脚本将高分辨率 PNG 图像转换为大量不同的低分辨率副本可能看起来很方便(确实如此),但不要忘记这种自动调整大小会呈现 明显不完美的图像。

分辨率越小——图标越模糊!

我的意思是,我也喜欢 imagemagick,但它不是完成这项任务的正确工具!

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

从2020年最新的Apple's Human Interface Guidelines开始,您应该准备以下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 文件,其中包含适用于任何现代屏幕的应用程序的所有漂亮清晰徽标。

【讨论】:

【参考方案4】:

有一个命令行节点模块可以完成将 PNG 文件转换为图标集目录的所有工作:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns

【讨论】:

不再支持。 :(【参考方案5】:

这些命令(在终端中输入)帮助我将旧的 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

更新

不再支持 iconutil 的 -c 参数。请改用--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

【讨论】:

感谢您展示这一点,多亏了这一点,我才能够从 icns 反向获取 pngs! :)【参考方案6】:

补充说明,当你创建.icns文件时,你需要重命名所有前缀为“icon_”的图片文件,否则iconutil会失败并报错:“.iconset:error: Failed生成 ICNS。”这根本没有信息。

【讨论】:

【参考方案7】:

与@Henry(上面的评论)相同,但将 PNG 文件名作为参数并输出具有相同名称的 ICNS。

注意: PNG 文件名预计只有 1 个点来分隔扩展名,即 xpto.png 。

(针对 shell 脚本更新)

因此,将下面的代码保存到您的 png 文件所在文件夹中名为“CreateICNS.sh”的文件中,并授予其执行权限。

代码:

#!/bin/bash
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”到同一个文件夹并输入:

./CreateICNS.sh PNG filename

其中 PNG filename 是您的 PNG 文件的名称,即 xpto.png 。

如果您的文件将命名为 abc.png,您将使用:

./CreateICNS.sh abc.png

2021 年 5 月 20 日更新:

我有这个的更新版本,但我不确定我在哪里找到它留下正确的参考所以如果有人是这个的所有者或知道某个互联网页面上的链接,请发表评论以便我可以更新学分:

这是一个完整的 bash 脚本,所以你应该将它保存为例如png2icns.sh 并赋予它执行权限。

然后您可以调用png2icns.sh pngfile1.png,它会生成 ICNS 文件以及一个图标集文件夹,其中包含 16x16 和 512x512 之间的所有图标分辨率。

#!/bin/bash
# Creates an icns file from a source image

src_image="$1"
if [ -z "$1" ]; then
    echo "No source image was passed to this script"
    exit 1
fi

icns_name="$2"
if [ -z "$2" ]; then
    icns_name="iconbuilder"
fi

if [ "$src_image:(-3)" != "png" ]; then
    echo "Source image is not a PNG, making a converted copy..."
    /usr/bin/sips -s format png "$src_image" --out "$src_image.png"
    if [ $? -ne 0 ]; then
        echo "The source image could not be converted to PNG format."
        exit 1
    fi
    src_image="$src_image.png"
fi

iconset_path="./$icns_name.iconset"
if [ -e "$iconset_path" ]; then
    /bin/rm -r "$iconset_path"
    if [ $? -ne 0 ]; then
        echo "There is a pre-existing file/dir $iconset_path the could not be deleted"
        exit 1
    fi
fi

/bin/mkdir "$iconset_path"

icon_file_list=(
    "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"
    "icon_512x512.png"
    "icon_512x512@2x.png"
    )

icon_size=(
    '16'
    '32'
    '32'
    '64'
    '128'
    '256'
    '256'
    '512'
    '512'
    '1024'
    )

counter=0    
for a in $icon_file_list[@]; do
    icon="$iconset_path/$a"
    /bin/cp "$src_image" "$icon"
    icon_size=$icon_size[$counter]
    /usr/bin/sips -z $icon_size $icon_size "$icon"
    counter=$(($counter + 1))
done

echo "Creating .icns file from $iconset_path"
/usr/bin/iconutil -c icns "$iconset_path"
if [ $? -ne 0 ]; then
    echo "There was an error creating the .icns file"
    exit 1
fi

echo "Done"
exit 0

【讨论】:

太棒了!很简单 :) 也许把它做成一个 .sh/script 会让它变得更多 :) 谢谢! @GutembergRibeiro 已经是一个 sh 脚本,它只是缺少 shebang。 澄清一下,初始图像是 1024x1024,但每英寸有多少像素? 72 或 144 还是无所谓? 我使用的是每英寸 72 像素,所以我确信它可以在这种格式下工作。你也可以看到没有 1024x1024@2x 所以我认为基本图像应该是 72 ppi。【参考方案8】:

我已经编写了一个 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 $sx$s "$largfile" "icon_$sx$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

【讨论】:

【参考方案9】:

我已经重构了@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_$qx$q$r.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

更新

不再支持 iconutil 的 -c 参数。请改用-—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_$qx$q$r.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR

【讨论】:

原始版本很简单,可以在任何shell中手动重现该过程。 如果您更喜欢手动操作,则根本不需要电脑。【参考方案10】:

非常简单的 .png ? .icns

    下载IconMaker.app - 这只是一个 .applescript 不会咬人 将 .png 拖放到刚刚创建的 IconMaker.app 上。

更多信息: http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

高山脉更新 iconutil 现在对源 .png 大小更加严格。跳转后的博客文章中有关此的更多信息。 ✌️

【讨论】:

【参考方案11】:

当我验证我的应用时,我收到了这个错误:

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

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

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

一方面,正如我在对安妮的回答的评论中提到的那样,您可能不需要使用 iconutil。您应该能够将图标集添加到您的项目中,并让 Xcode 为您转换它作为构建的一部分。

不管怎样,这可能是你的问题:

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

没有 1024 x 1024 磅值。 The 1024 by 1024 pixel element (which was 1024 points before Mountain Lion) is now used for 512 by 512 points @2x.

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

【讨论】:

【参考方案12】:

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

【讨论】:

我不能代表最初的提问者,但这个答案正是 i 所需要的。谢谢! Apple 文档说“注意:不要使用 Icon Composer——它不能创建高分辨率的 icns 文件。”。也就是说,@2x 图标不能那样做。 Icon Composer 似乎工作正常,它作为 Xcode 图形工具包的一部分从 Apple 开发者网站单独提供。另请参阅here。【参考方案13】:

@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_$ix$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【参考方案14】:

这是一个主要基于 Henry's example 的函数(可能在 ~/.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_$ix$i.png
            sips -z $n $n "$1" --out "$filename".iconset/icon_$ix$i@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "$1" --out "$filename".iconset/icon_$nx$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

创建从16x16512x512@2x 的10 个尺寸;接受输入图像 仅限.png 格式。

【讨论】:

【参考方案15】:

运行iconutil -c icns Icon.iconset

注意

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

【讨论】:

为什么是3x?苹果不需要它。【参考方案16】:

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

因为我在这两项任务上都遇到了长达一小时的问题,而且我也不喜欢我没有“看到”发生了什么,所以这里是谨慎的道路:

创建 10 个正确的 icns 文件: 我使用了上面来自 Henry 的脚本:它仍然适用于 HighSierra 和 Xcode 9.2,包括“c”命令。 我得到的 icns 文件在 Finder/Quicklook 中仅显示为一种图标大小,而在预览中仅显示 10 种尺寸中的 8 种。 所以我使用终端,将 cd 带到我的文件夹并使用命令: iconutil -c iconset (icns filename) 在刚刚创建的 icns 文件上将 icns 文件恢复到 iconset 文件夹,然后 - 瞧 - 我可以看到我新创建的 10 个图标文件。使用图标集文件夹上的快速查看(并使用全屏模式能够通过滑块放大它们),我可以检查所有尺寸实际上看起来都很好。

顺便说一句:它们看起来比我使用 PSE 调整大小的尝试更好,很可能是因为我没有花时间使用 PSE 中的所有调整大小选项。如果您确实使用 PSE,请确保您的 png 文件在没有颜色配置文件的情况下保存。另外,承认我的无知,对我来说,256x256@2 文件与 512x512 文件相同 - 都是 72dpi。尝试遵循上面的 144 dpi cmets 对我不起作用。

让您的 Xcode 项目正确使用它们: 首先,我删除了我在 Xcode 中所有徒劳无功的尝试,并将一个干净的版本提交到 git 存储库(聪明的做法是先提交一个干净的版本 - 在我疯狂地开始添加图标 odyssee 之前)。 我还确保在 info.plist 文件中没有链接到“图标文件”条目的指针,并且在我的常规项目设置中,我为应用图标选择了 AppIcon。 然后,我添加了 assets.asset 目录,并在 assets 目录中为 OS 添加了一个新的“AppIcons and Launch Images”AppIcon 文件夹。 然后我将每个 png 图片文件从 iconset 文件夹中复制(按下选项拖放)到相应的 AppIcon Spaceholder 中。再次,我可以看到正在发生的事情。 Xcode 确实将其转换为 icns 文件,或者 - 作为我从 icns 文件夹派生的图标集文件夹 - 文件格式被接受。

然后存档并验证,上传或验证时不会出现错误。

【讨论】:

格式化!您的答案可能很好,但不可读。使用段落和回车。【参考方案17】:

我需要这个,但对于 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_$sizex$size.png")
        set (ipath2x "$iconset/icon_$sizex$size@2x.png")

        list (APPEND deplist "$ipath" "$ipath2x")

        add_custom_command (
            OUTPUT "$ipath"
            COMMAND "$convert_exe" ARGS "$sourceimg" -resize "$sizex$size" "$ipath"
            MAIN_DEPENDENCY "$sourceimg"
            COMMENT "ICNS resize: $ipath"
            VERBATIM)

        add_custom_command (
            OUTPUT "$ipath2x"
            COMMAND "$convert_exe" ARGS "$sourceimg" -resize "$size2xx$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_$sizex$size.png")
        set (ipath2x "$iconset/icon_$sizex$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 ()

【讨论】:

【参考方案18】:

您好,根据我的需要,我制作了一个可以单独拖放图标或在文件夹中搜索图标的液滴(我仅限于文件夹,因为在卷上搜索所有图标可能需要很多时间)。因此,在拖放中,您可以拖放文件夹或应用程序,以及任何可以包含图标的东西。创建的图标集带有原始图标的名称,它被放置在目录“/aaaicones”和图标的路径中。文件夹中的示例“/ aaaicones 如果你提交 xcode.app 你会发现 “/aaaicones/Applications/xcode.app/access.iconset”和/aaaicones/Applications/xcode.app/access.icns(重新创建的图标)将有一个文本文件,其中跟踪图标的完整路径,并且相应图标集示例的路径 “/Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn.framework/Versions/A/Resources/access.icns” “/aaaicones/Applications/xcode.app/access.iconset”在示例(xcode)中可以创建一个大小为 214 MB 的文件夹(包含所有图标和图标集)。如果单独对待一个图标,它会放在目录“/aaaicones/aIconeseule/”和它的原始路径,例如 /aaaicones/aIconeseule/Mac Elcapitan/.VolumeIcon.icns 和 /aaaicones/aIconeseule/Mac Elcapitan /.VolumeIcon.iconset 与 /aaaicones/aIconeseule/Mac Elcapitan/aalisticones.txt 水滴在下方

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

【讨论】:

以上是关于如何使用 iconutil 手动创建 icns 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中,如何以编程方式从 .icns 文件中提取 .png 图像?

是否可以以某种方式将缩略图icn 添加到操作表?

icns图标制作

ICN6202/ICN6202:MIPI转LVDS/mipi转RGB

如何在linux shell脚本中使用变量遍历路径

png在线转换icns