我一直在努力解决同样的问题。我有一个带有图标图像的 SVG,我需要从中创建一个icon.ico
文件。让我描述一下我找到的解决方案:
第 1 步:确定要在icon.ico
文件中包含哪些分辨率。
对此没有明确的指导方针。甚至微软也以不一致的图标分辨率发布其软件。有一个关于那个的问题。因此,我认为我们能做的最好的事情是使用Nirsoft 的 IconsExtract或类似工具来检查最流行和现代 Windows 程序的图标中包含哪些分辨率。
第 2 步:为要包含在文件中的每个分辨率创建 .pngicon.ico
文件。
很多答案建议使用inkscape,但您可以通过以下方式使用ImageMagick完成所有操作(以防万一,我检查了结果图像是否与您使用 inkscape 相同):
magick.exe convert -size 16x16 -background transparent -depth 8 MyIconImage.svg 16.png
...
magick.exe convert -size 256x256 -background transparent -depth 8 MyIconImage.svg 256.png
但是,如果您仍然想使用inkscape,那就是命令:
inkscape.exe MyIconImage.svg -w 16 -h 16 -o 16.png
还有一些答案建议使用 ImageMagick 的icon:auto-resize
命令行参数来避免为每个分辨率创建单独的 PNG 文件。我不建议使用它,因为要获得最佳质量,最好避免调整大小,因为它比单独将 SVG 文件渲染到每个分辨率更不准确。
第 3 步:组装您的 icon.ico 文件。
magick.exe convert 16.png 20.png 24.png 32.png 40.png 48.png 64.png 256.png -compress jpeg icon.ico
-compress jpeg
用于解决ImageMagick中的以下问题,如以下评论中所述。您可以使用以下命令
查看有关创建文件的详细信息:icon.ico
magick.exe identify icon.ico
Powershell 脚本“CreateIcoFromSvg.ps1”
让我提供一个自动执行上述步骤的 powershell 脚本:
# You can download ImageMagick from: https://imagemagick.org/script/download.php
$imageMagick = "$PSScriptRoot/ImageMagick-7.1.0-portable-Q16-x64/magick.exe"
$svgIcon = "MySvgIcon.svg"
$iconResolutions = 16,20,24,32,40,48,64,256
# Create 16.png, ..., 256.png image files
$pngImages = @()
Foreach($r in $iconResolutions) {
& $imageMagick convert -size "${r}x${r}" -background transparent -depth 8 $svgIcon "${r}.png"
$pngImages += "${r}.png"
}
# Combine all PNG image files into an icon.ico file
& $imageMagick convert $pngImages -compress jpeg "icon.ico"
# Remove PNG files
Foreach($image in $pngImages) {
Remove-Item $image
}