天天记事 378 / 2022-09-14 21:32:42
本文分两部分内容:
第一部分 使用MacOS提供的命令来制作icns文件
首先验证下,MacOS是否存在iconutil命令
iconutil -help
如果出现下面提示,那么说明你的Mac支持该命令
Usage: iconutil --convert ( icns | iconset) [--output file] file [icon-name]
另外,也检测下是否存在图像处理命令
sips --help
出现结果自己判断吧,如果没有sips(图像处理命令),可以通过ps等其它工具来完成图像处理工作,但如果没有iconutil工具,那么此部分就可以不用看了,直接到第二部分吧。
有了上面命令,接下来直接说步骤:
1. 首先准备一张1024x1024像素的png图片(j2k或tiff也可以,但不能用jpeg,icns不支持)
2. 创建一个文件夹,名称为xxx.iconset, 注意xxx可以随意变更,但后面的.iconset不能变,这个是iconutil命令的强行要求(为啥要这么干?估计怕操作过程搞错目录了吧)使用sips命令制作各种分辨率的图,最好含有下面分辨率的全部图,且名称也保持一致。
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
注意,这些文件都需要放在xxx.iconset目录里面,分辨率看文件名就知道了,另外含有"@2x"的文件名对应的文件的实际分辨率需要是文件名描述的2倍。比如icon_32x32.png文件的尺寸就是32x32,而icon_32x32@2x.png的尺寸需要是64x64,其它类推。
3. 通过sips制作各种尺寸的图,命令如下(参考,路径自己修改)
#命令模板,当然可以通过帮助查看更多参数选项的使用方法,这里仅取各种分辨率的图,足够了
sips -z <width> <height> <source-image-path> --out <out-image-path>
#或者使用下面命令,注意参数z和Z,大写Z表示按照宽度等比缩放高度
#sips -Z <width> <source-image-path> --out <out-image-path>
通过上面模板命令,就可以使用获取各种分辨率的图像了,这里我们假设和xxx.iconset同目录下有张原始大尺寸的PNG图片source.png,那么可用如下命令进入source.png所在目录,就可以使用下面这些命令了
sips -Z 16 sources.png --out xxx.iconset/icon_16x16.png
sips -Z 32 sources.png --out xxx.iconset/icon_16x16@2x.png
sips -Z 32 sources.png --out xxx.iconset/icon_32x32.png
sips -Z 64 sources.png --out xxx.iconset/icon_32x32@2x.png
sips -Z 128 sources.png --out xxx.iconset/icon_128x128.png
sips -Z 256 sources.png --out xxx.iconset/icon_128x128@2x.png
sips -Z 256 sources.png --out xxx.iconset/icon_256x256.png
sips -Z 512 sources.png --out xxx.iconset/icon_256x256@2x.png
sips -Z 512 sources.png --out xxx.iconset/icon_512x512.png
sips -Z 1024 sources.png --out xxx.iconset/icon_512x512@2x.png
注意,里面不是缺少icon_64x64.png,而是icns标准里面貌似没有合适的定义
4. 生成icns文件
有了上面的icon_那些图标并存放在标准(.iconset)的目录里面,那么直接命令行进入source.png所在目录,直接执行下面命令即可。
#命令模板
iconutil -c icns -o <icnsfile> <iconset-dir>
#当前案例命令
iconutil -c icns -o xxx.icns xxx.iconset
最终成品文件xxx.icns就生成了。
第二部分 根据incs文件结构制作icns文件
如果是在MacOS环境下,我们建议直接使用命令比较合适,如果是在非MacOS环境下,我们就可以从下面方法入手
首先通过图像处理工具准备好第一部分描述的那些各种分辨率的图像文件,需要注意的是,这里不需要保证文件夹必须是xxx.iconset,文件夹名称随意,文件名也随意,但最好能够被你识别。
如果指定的那些分辨率的图标已经准备好了,那么可以继续看下面的内容。
先来说说icns的文件结构,icns文件本身是二进制文件,结果如下
1. 文件头:
偏移量 | 字节数 | 描述 |
---|---|---|
0 | 4 | 标志,四个字节,必须是"icns",即序列:0x69, 0x63, 0x6e, 0x73 |
4 | 4 | icns文件的最终大小(按照BigEndian存储Integer数值) |
2. 图标数据(上面提到的按尺寸由大到小按规则写入-我是这样做的,你也可以不排序),注意:是循环写入各种分辨率的图标
偏移量 | 字节数 | 描述 |
---|---|---|
0 | 4 | 图标类型,四个字节(后面有描述) |
4 | 4 | 图标信息快大小,注意数值为:4+4+图标文件大小(按照BigEndian存储Integer数值) |
8 | n | 图标二进制文件 |
3 图标类型,标准里面有点多,我这里仅列出我用到的,有兴趣的可以全部看看(解析现有的icns文件就有需要看完了),地址为:https://en.wikipedia.org/wiki/Apple_Icon_Image_format
FRAMES_CODEC_MAP.put("icon_512x512@2x.png", "ic10");//1024x1024
FRAMES_CODEC_MAP.put("icon_512x512.png", "ic09");//512x512
FRAMES_CODEC_MAP.put("icon_256x256@2x.png", "ic14");//512x512
FRAMES_CODEC_MAP.put("icon_256x256.png", "ic08");//256x256
FRAMES_CODEC_MAP.put("icon_128x128@2x.png", "ic13");//256x256
FRAMES_CODEC_MAP.put("icon_128x128.png", "ic07");//128x128
FRAMES_CODEC_MAP.put("icon_32x32@2x.png", "ic12");//64x64
FRAMES_CODEC_MAP.put("icon_32x32.png", "icp5");//32x32
FRAMES_CODEC_MAP.put("icon_16x16@2x.png", "ic05");//32x32
FRAMES_CODEC_MAP.put("icon_16x16.png", "ic04");//16x16
注意,上面的看到的类似于"ic10"、"ic09"等就是图标类型,4个字节,写入数据时和上面的对上号就没问题了
此时,你可以打开你的开发工具,试着写点代码练一练了
上一篇:WEBP图像格式
下一篇:MACOS 网卡信息配置(代理)