如果你想使用iconutil
,你可以这样做。至少在我的 10.9.5 系统上,它是基本操作系统的一部分。这不是一个特殊的安装,就像开发者工具一样。您可以使用以下方法验证:
pkgutil --file-info /usr/bin/iconutil
在这里,输出:
volume: /
path: /usr/bin/iconutil
pkgid: com.apple.pkg.BSD
pkg-version: 10.9.0.1.1.1306847324
install-time: 1402788942
uid: 0
gid: 0
mode: 755
重要的部分是 pkgid。它是 BSD 包的一部分,它是基本操作系统的一部分。
也就是说,编写一些代码来做到这一点并不难。
您可以使用 CGDestination API。使用 创建目的地CGImageDestinationCreateWithURL()
。对于type
, 通过kUTTypeAppleICNS
.
鉴于您想从单个文件添加图像,最简单的方法可能是CGImageSource
为每个文件创建一个使用CGImageSourceCreateWithURL()
. 然后,您可以使用 .将图像从源直接添加到目标CGImageDestinationAddImageFromSource()
。CFRelease()
将图像添加到目标后,不要忘记每个源。
然后,调用CGImageDestinationFinalize()
让目标将图像写入 URL。然后,CFRelease()
目的地。
如果每个源图像都设置了正确的 DPI,则会将其原封不动地复制到目标。如果源图像没有设置正确的 DPI,您可以通过将属性字典传递给CGImageDestinationAddImageFromSource()
. 包括键kCGImagePropertyDPIHeight
和,每个键都有一个具有所需 DPIkCGImagePropertyDPIWidth
的对象的对应值。CFNumber
对于正常分辨率的图标,请使用 72 DPI。对于高分辨率 (@2x) 图标,请使用 144 DPI。
也可以使用旧的 IconFamily API 创建 ICNS 文件,但它有点麻烦。此外,它不支持高分辨率图标。
首先,为图标系列创建一个句柄(pointer-to-pointer-to-resizable-buffer):
IconFamilyHandle iconFamily = (IconFamilyHandle)NewHandle(0);
然后,对于每个图像大小(16、32、128、256 和 512),您为图像数据的原始位图创建一个句柄。位图应为每像素 32 位,每分量 8 位,ARGB 非预乘数据,无填充。
int size = /* 16, 32, 128, 256, or 512 */;
Handle handle = NewHandle(size * size * 4);
// fill handle with image data; buffer pointer is *handle
然后,通过如下调用将该句柄添加到图标系列:
SetIconFamilyData(iconFamily, kIconServices16PixelDataARGB, handle);
对于其他尺寸,将“16”替换kIconServices16PixelDataARGB
为适当的值。
然后,将图标系列句柄的数据写入文件。通过简单地取消引用句柄(即*iconFamily
)来获得指向数据的指针。它的大小是通过调用获得的GetHandleSize((Handle)iconFamily)
。
通过调用来处理您在此过程中创建的所有句柄DisposeHandle()
。