关于Objective C:如何使用sip或其他方式以编程方式使Mac OS X ICNS具有10种不同的图像

How to programmatically make Mac OS X ICNS with 10 different images using sips or other

我的问题是我需要。我需要以编程方式实现。

因此对于Mac OS X,应用程序图标应具有以下大小:
> </p>
<p>我有10张图片。我在右上角放置了一个徽章,该徽章的放置和位置不缩放。所以我有10张不同的图像。</p>
<p>如何用此制作ICNS?</p>
<p>我想使用sips,但是sips只占用一个文件,并且可以进行所有缩放:http://cc.bingj.com/cache.aspx?q=mac icns sips参数列表</p>
<hr>
<p>如果要使用<wyn>iconutil</wyn>,则可以执行此操作。至少在我的10.9.5系统上,它是基本OS的一部分。这不是特殊的安装,例如开发人员工具。您可以使用以下命令进行验证:</p>
<div class=

1
pkgutil --file-info /usr/bin/iconutil

在这里,输出:

1
2
3
4
5
6
7
8
9
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软件包的一部分,而BSD软件包是基本OS的一部分。

也就是说,编写一些代码来做到这一点并不难。

您可以使用CGDestination API。使用CGImageDestinationCreateWithURL()创建目的地。对于type,传递kUTTypeAppleICNS

鉴于您要从单个文件中添加图像,使用CGImageSourceCreateWithURL()为每个文件创建一个CGImageSource可能是最简单的。然后,您可以使用CGImageDestinationAddImageFromSource()将图像从源直接添加到目标。在将每个图像的源添加到目标之后,请不要忘记对每个源CFRelease()

然后,调用CGImageDestinationFinalize()以使目标将图像写出到URL。然后,CFRelease()目标。

如果每个源图像都设置了正确的DPI,则会将其原封不动地复制到目标位置。如果源图像未设置正确的DPI,则可以通过将属性字典传递给CGImageDestinationAddImageFromSource()来覆盖它。包括键kCGImagePropertyDPIHeightkCGImagePropertyDPIWidth,每个键都带有具有所需DPI的CFNumber对象的对应值。对于正常分辨率的图标,请使用72 DPI。对于高分辨率(@ 2x)图标,请使用144 DPI。

创建ICNS文件也可以使用旧的IconFamily API进行,但这有点麻烦。此外,它不支持高分辨率图标。

首先,为图标系列创建一个句柄(指针到指针可调整大小的缓冲区):

1
IconFamilyHandle iconFamily = (IconFamilyHandle)NewHandle(0);

然后,针对每种图像大小(16、32、128、256和512),为图像数据的原始位图创建一个句柄。位图应为每个像素32位,每个分量8位,无填充的ARGB非预乘数据。

1
2
3
int size = /* 16, 32, 128, 256, or 512 */;
Handle handle = NewHandle(size * size * 4);
// fill handle with image data; buffer pointer is *handle

然后,通过如下调用将那个句柄添加到图标族:

1
SetIconFamilyData(iconFamily, kIconServices16PixelDataARGB, handle);

对于其他尺寸,将kIconServices16PixelDataARGB中的" 16"替换为适当的值。

然后,将图标族句柄的数据写出到文件中。只需简单地取消引用句柄(即*iconFamily)即可获得指向数据的指针。它的大小是通过调用GetHandleSize((Handle)iconFamily)

获得的。

通过调用DisposeHandle()处理您在创建过程中创建的所有句柄。