如何用ImageMagick创建所有尺寸内嵌PNG数据的ICO文件
问题
我在研究部分内部存储PNG数据而非传统ICO编码数据的ICO文件,希望制作出相同格式的文件,示例如下:
$ identify sample.ico sample.ico[0] PNG 32x32 32x32+0+0 8-bit sRGB 884B 0.000u 0:00.000 sample.ico[1] PNG 16x16 16x16+0+0 8-bit sRGB 884B 0.000u 0:00.000 $ file sample.ico sample.ico: MS Windows icon resource - 2 icons, 32x32, 16 colors withPNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced, 4 bits/pixel, 16x16, 16 colors withPNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced, 4 bits/pixel
经过测试我发现可通过如下命令生成单张内嵌PNG数据的ICO文件:
$ convert icon-32x32.png png8:test1.ico $ identify test1.ico test1.ico PNG 32x32 32x32+0+0 8-bit sRGB 934B 0.000u 0:00.000
但如果传入多个输入文件,会拆分生成多个独立输出文件,无法合并为单个ICO:
$ convert icon-16x16.png icon-32x32.png png8:test2.ico $ ls -1 test2* test2-0.ico test2-1.ico
如果输出路径不添加png8:前缀,所有图像数据都会被转换为传统ICO编码格式:
$ convert icon-16x16.png icon-32x32.png test3.ico $ identify test3.ico test3.ico[0] ICO 16x16 16x16+0+0 32-bit sRGB 5.43KB 0.000u 0:00.000 test3.ico[1] ICO 32x32 32x32+0+0 32-bit sRGB 5.43KB 0.000u 0:00.000
当图像尺寸过大超出传统ICO格式支持范围时,对应尺寸的图像才会保留PNG编码:
$ convert ../icon-32x32.png ../icon-512x512.png test4.ico $ identify test4.ico test3.ico[0] ICO 32x32 32x32+0+0 32-bit sRGB 53.4KB 0.000u 0:00.000 test3.ico[1] PNG 512x512 512x512+0+0 8-bit sRGB 53.4KB 0.000u 0:00.000
解决方案
使用ImageMagick内置的ICO编码参数ico:png,将参数值设为1即可强制所有尺寸的图标条目以PNG编码内嵌到ICO文件中,命令格式如下:
# ImageMagick 6 版本 convert 尺寸1.png 尺寸2.png [其他尺寸PNG...] -define ico:png=1 输出文件.ico # ImageMagick 7 版本,将convert替换为magick即可 magick 尺寸1.png 尺寸2.png [其他尺寸PNG...] -define ico:png=1 输出文件.ico
以打包16x16、32x32两个尺寸的PNG为例,执行如下命令即可生成全PNG内嵌的ICO:
convert icon-16x16.png icon-32x32.png -define ico:png=1 all-png.ico
生成后用identify all-png.ico校验,所有条目都会显示为PNG格式,和示例文件表现一致。
之前操作失效的原因
- 加
png8:前缀时,ImageMagick会将输出格式判定为PNG而非ICO,多图输入时会自动按帧拆分为多个独立文件,不会执行ICO封装逻辑,因此会生成带序号后缀的拆分文件。 - 不加前缀默认走ICO编码逻辑时,默认规则仅对尺寸≥256x256的图标条目使用PNG编码,更小尺寸会转成传统ICO的BMP编码,因此小尺寸条目会显示为ICO格式。
内容的提问来源于stack exchange,提问作者Smorfph
相关产品推荐
相关产品推荐

