127

当我验证我的应用程序时,我收到此错误:

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

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

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

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

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

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

4

18 回答 18

331

这是一个将 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
于 2013-12-20T12:24:29.927 回答
70

查看以下说明(链接):

使用 iconutil 手动创建 icns 文件

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

将一组图标转换为 icns 文件

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

iconutil -c icns <iconset filename>

<iconset filename>包含要转换为的图标集的文件夹的路径在哪里icns。输出将写入与 相同的位置iconset 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"

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

于 2012-09-06T23:15:33.603 回答
31

虽然使用各种脚本将高分辨率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文件放在同一目录中,其中包含适用于任何现代屏幕的应用程序的所有漂亮清晰徽标。

于 2016-09-24T16:01:14.380 回答
15

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

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
于 2016-04-05T03:13:37.813 回答
13

这些命令(在终端中输入)帮助我将旧的 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
于 2012-10-29T17:59:23.827 回答
12

附加说明,当您创建.icns 文件时,您需要重命名所有带有前缀“icon_ ”的图片文件,否则,iconutil 将失败并显示错误消息:“.iconset:error: Failed to generate ICNS”。这根本没有信息。

于 2015-07-30T15:08:19.370 回答
9

与@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-05-20:

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

这是一个完整的 bash 脚本,因此您应该将其保存为示例png2icns.sh并授予其执行权限。

然后你可以调用png2icns.sh pngfile1.png它,它会生成 ICNS 文件以及一个 iconset 文件夹,其中包含 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
于 2018-05-26T07:00:36.583 回答
6

我重构了@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
于 2015-06-30T23:41:54.417 回答
6

死简单 .png .icns

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

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

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

于 2016-12-06T16:12:22.553 回答
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

于 2016-12-14T16:08:43.890 回答
3

Apple 的旧版 Icon Composer 2.2 版运行良好,您只需打开其中的 .ICNS,按 1024x1024 按钮并添加您的图像。

于 2012-11-14T22:41:41.397 回答
3

当我验证我的应用程序时,我收到此错误:

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

⋮</p>

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

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

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

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

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

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

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

于 2012-09-07T06:48:01.353 回答
3

@dardo82 的 shell 代码很好用。这是 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
于 2017-07-22T01:10:05.813 回答
1

iconutil -c icns Icon.iconset

笔记

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

在此处输入图像描述

于 2017-08-09T13:31:41.057 回答
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格式的输入图像。

于 2017-06-12T22:08:18.640 回答
1

有 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 评论对我不起作用。

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

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

于 2018-02-23T20:11:00.323 回答
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 ()
于 2019-01-26T01:07:57.667 回答
-2

您好,根据我的需要,我制作了一个可以单独拖放图标或在文件夹中搜索图标的液滴(我仅限于文件夹,因为搜索所有图标的卷可能需要很多时间)。因此,在拖放中,您可以拖放文件夹或应用程序,以及任何可以包含图标的东西。创建的图标集带有原始图标的名称,它被放置在目录“/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
于 2016-12-13T10:38:02.733 回答