1

我的问题是我需要。我需要以编程方式实现这一目标。

因此,对于 mac os x,应用程序图标应具有以下尺寸:

我有 10 张图片。每个我都在右上角放置了一个徽章,这个徽章的位置和位置没有缩放。所以我有 10 个不同的图像。

如何从中制作ICNS?

我想使用 sips,但是 sips 只需要一个文件,它会进行所有缩放:http ://cc.bingj.com/cache.aspx?q=mac+icns+sips+argument+list&d=5035141870911884&mkt=en-US&setlang =en-US&w=n3PZcWn6bEPxt4O96PPLd6nugtVq5jDz

有没有办法/usr/bin/sips把我的 10 张图片做成一个 icns?如果sips不能这样做,还有其他方法吗?

4

1 回答 1

3

如果你想使用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()

于 2015-01-07T00:06:57.783 回答