我想通过使用ImageMagick从SVG文件动态创建Windows应用程序的.ico
图标。请问我该如何操作?
Microsoft 列出了图标的各种颜色深度和大小要求。ImageMagick具有-depth
和-colors
选项,但我不确定在这种情况下如何正确使用它们。
此外,似乎Vista+支持256x256高分辨率图标嵌入到同一个.ico
中,可以(应该?必须?)是压缩的PNG格式。请问如何将Windows XP图标和这个新的Vista图标合并成单个.ico
文件?
我想通过使用ImageMagick从SVG文件动态创建Windows应用程序的.ico
图标。请问我该如何操作?
Microsoft 列出了图标的各种颜色深度和大小要求。ImageMagick具有-depth
和-colors
选项,但我不确定在这种情况下如何正确使用它们。
此外,似乎Vista+支持256x256高分辨率图标嵌入到同一个.ico
中,可以(应该?必须?)是压缩的PNG格式。请问如何将Windows XP图标和这个新的Vista图标合并成单个.ico
文件?
convert image.png -bordercolor white -border 0 \
\( -clone 0 -resize 16x16 \) \
\( -clone 0 -resize 32x32 \) \
\( -clone 0 -resize 48x48 \) \
\( -clone 0 -resize 64x64 \) \
-delete 0 -alpha off -colors 256 favicon.ico
-alpha remove
而不是-alpha off
,则应该能够省略-bordercolor white -border 0
。 - sschuberthmagick convert in.jpg -define icon:auto-resize=16,48,256 -compress zip out.ico
http://imagemagick.org/script/command-line-options.php#define
似乎仅仅使用ImageMagick是无法达到此目的的,因为它不能很好地处理SVG调整大小(而是在光栅化之后才调整SVG,这会产生可怕的结果)。
通过使用Inkscape进行转换似乎是可能的,例如,下面的一行命令应该可以给你一个可用的图标,并包含所有图标尺寸:
mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;
我整理了Malcolm的解决方案,修复了一个错误,并使脚本输出tiff文件,这样你就可以在OSX上运行tiff2icns。
#! /bin/bash
# converts the passed-in svgs to tiff and ico
if [[ $# -eq 0 ]]; then
echo "Usage: $0 svg1 [svg2 [...]]"
exit 0
fi
temp=$(mktemp -d)
declare -a res=(16 24 32 48 64 128 256 512)
for f in $*; do
mkdir -p $temp/$(dirname $f)
for r in "${res[@]}"; do
inkscape -z -e $temp/${f}${r}.png -w $r -h $r $f
done
resm=( "${res[@]/#/$temp/$f}" )
resm=( "${resm[@]/%/.png}" )
for filetype in ico tiff; do
convert "${resm[@]}" ${f%%.*}.$filetype
done
done
rm -rf $temp
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.exe MyIconImage.svg -w 16 -h 16 -o 16.png
icon:auto-resize
命令行参数,以避免为每个分辨率创建单独的PNG文件。我不建议使用它,因为为了获得最佳质量,最好避免调整大小,因为这比将SVG文件渲染到每个分辨率中要不准确。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中特定问题的一种变通方法,具体描述请参考以下issue in ImageMagick链接所述的comment。
您可以使用以下命令查看创建的icon.ico
文件的详细信息:
magick.exe identify icon.ico
让我提供一个自动化上述步骤的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
}
我最近意识到,使用convert
实际上无法解决此任务,因为convert
会将所有输入图像转换为bmp
并更改图像的颜色深度。
因此,我已更新我的脚本以使用icotool
(sudo apt install icoutils
):
#!/bin/bash
for size in 16 24 32 48 64 96 128 256; do
inkscape --export-filename $size.png -w $size -h $size logo.svg >/dev/null 2>/dev/null
done
for size in 16 24 32 48; do
convert -colors 256 +dither $size.png png8:$size-8.png
convert -colors 16 +dither $size-8.png $size-4.png
done
convert 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png logo.ico
icotool -c -o logo.ico 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png -r 128.png -r 256.png
rm 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png
在之前所有的回答基础上,纠正以下错误:
-color=256
,因为现代Windows版本(Vista+)需要所有尺寸的32位颜色版本。所有内容都在一个bash脚本中(从logo.svg
开始生成logo.ico
):
#!/bin/bash
for size in 16 24 32 48 64 96 128 256; do
inkscape --export-filename $size.png -w $size -h $size logo.svg >/dev/null 2>/dev/null
done
for size in 16 24 32 48; do
convert -colors 256 +dither $size.png png8:$size-8.png
convert -colors 16 +dither $size-8.png $size-4.png
done
convert 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png logo.ico
rm 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png
convert input.png -bordercolor white -border 0 ( -clone 0 -resize 16x16 ) ( -clone 0 -resize 24x24 ) ( -clone 0 -resize 32x32 ) ( -clone 0 -resize 40x40 ) ( -clone 0 -resize 48x48 ) ( -clone 0 -resize 64x64 ) ( -clone 0 -resize 256x256 ) -delete 0 -alpha off -colors 256 output.ico
logo.svg
转换为 logo.ico
,使用 Inkscape 导出不同大小的 png 图像:eval convert \
'<(inkscape -e /dev/stderr logo.svg -w '{16,24,32,48,64,128,256}' 2>&1 > /dev/null)' \
logo.ico
stderr
和重定向是为了避免Inkscape的成功消息出现在图像数据中,该消息会在stdout
上显示为“Bitmap saved as: /dev/stdout”。修改hnasarat的答案,适用于Windows用户。最简单的方法是使用Chocolatey安装InkScape和ImageMagick,然后在批处理文件中运行以下命令。 (它不像其他答案那样灵活,你只需传入一个svg文件,但它会生成Favicon Cheat Sheet中推荐的所有网站图标。)
@ECHO off
IF "%1"=="" (
ECHO You must provide an svg file
EXIT /b
)
IF NOT EXIST favicons MD favicons
SET "sizes=16 24 32 48 57 64 72 96 120 128 144 152 195 228 256 512"
FOR %%s IN (%sizes%) DO (
inkscape -z -e favicons/favicon-%%s.png -w %%s -h %%s %1
)
convert favicons/favicon-16.png favicons/favicon-24.png favicons/favicon-32.png favicons/favicon-48.png favicons/favicon-64.png favicons/favicon.ico
创建 ICO 文件并保持 SVG 的纵横比:
最后,使用 ImageMagick 的 convert
命令:
convert -background none -resize 256x144 -gravity center -extent 256x144 image.svg image.ico