How to programmatically make Mac OS X ICNS with 10 different images using sips or other
我的问题是我需要。我需要以编程方式实现。
因此对于Mac OS X,应用程序图标应具有以下大小:
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()来覆盖它。包括键kCGImagePropertyDPIHeight和kCGImagePropertyDPIWidth,每个键都带有具有所需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()处理您在创建过程中创建的所有句柄。
- 绝对赞!谢谢你,肯!我将尝试编写该CoreFoundation代码。从哪个OSX开始,您是否有机会知道iconutil是否可用?这里的主题似乎表明在某些Mac上缺少该主题:StackOverflow ::图标集命令行工具\\'iconutil \\'在哪里?
-
抱歉,我不知道何时引入iconutil。不过,这是一个好/重要的问题。您希望部署多久?我认为CGImageDestination仅在10.6中才开始支持ICNS,但这是错误的。因此,您仅应尝试从10.7开始使用。
-
感谢您对CGImageDestination的重要说明,我不知道这一点。我在Firefox 4的附加组件中使用此功能,而OSX> = 10.5则支持该附加功能。您是否有机会知道10.5版CGImageDestination的解决方法?
-
iconutil在10.5中不可用。我有一个旧的10.6分区,甚至没有。在CGImageDestination支持的ICNS之前,有两种选择:1)使用旧的Carbon时代IconFamily API;或2)使用CGImageDestination将图像组合成TIFF文件,然后在其上调用tiff2icns。不幸的是,10.6.8中CGImageDestination \\对ICNS的支持中的错误也影响了tiff2icns。无论如何,那些较旧的操作系统将不支持ICNS文件中的高分辨率图标。也有用于ICNS格式的第三方开源库。
-
谢谢Ken!似乎在10.6.8 v1.1之前,他们甚至都不支持ICNS,这是真的吗?每个评论都在这里:如何使用iconutil手动创建icns文件?因此,如果我想支持10.5和10.6,我应该将其转换为以前使用的格式,对吧?您知道当时的图标文件类型是什么吗?谢谢Ken,我非常感谢您提供的出色帮助,尤其是您对旧分区的挖掘!
-
icoutils绝对很棒!这是我的代码:GitHubGIST :: Noitidart / _ff-addon-snippet-NsiProcesIconutilIcns.js现在可以弄清楚它们在10.5和10.6中使用了哪种图标文件类型,您可以给我的任何指导都太棒了!
-
确实在10.5和10.6中使用了ICNS。它可以追溯到经典的Mac OS。
-
哦,当晚,我仍然需要为10.5和10.6做一个ICNS,但这只是必须做些不同的事情。我懂了,谢谢您对组合图像进行注释,然后再使用tiff2icns。谢谢!
-
但是tiff2icns和CGImageDestination一样,会在10.6.8中生成错误的ICNS文件。 (这是因为自CGImageDestination开始支持ICNS以来,tiff2icns一直在幕后使用CGImageDestination。)
-
谢谢您的保存。因此,唯一的方法是转到IconFamily Carbon API。您能否像上面的操作一样概述从api调用的内容,我不知道C我只是将事物转换为ctypes哈哈
-
我已经使用IconFamily API更新了答案。请注意,它不支持高分辨率图标。您可能需要对这两种技术进行编码,并根据操作系统的版本在它们之间进行切换。另外,高分辨率图标(无论它们是在支持它们的OS版本上创建的)在早期版本的OS中都无法正确理解/显示。我不记得确切在哪里添加了支持。您将必须进行广泛的测试。
-
我绝对会为两者编写代码,非常感谢您提供的如此出色的帮助!!对此,我真的非常感激!我也一定会分享我的发现!我至少可以做一点回报:)
-
嗨,@ Ken,我在这方面取得了进展,并且很好奇旧的API不支持64位大小吗?我看到对于大小,我们只有16,32,128,256和512。