使用ImageMagick创建Windows ICO文件的配方?

Lin*_*nas 24 icons imagemagick

我想.ico通过使用ImageMagick动态地(从SVG文件)为我的Windows应用程序创建图标.我怎么做?

Microsoft 列出了图标的各种颜色深度和大小要求.ImageMagick有-depth-colors选项,但在这种情况下我不确定如何正确使用它们.

另外,它看起来像Vista +支持嵌入到相同的256x256高分辨率图标.ico,可以(应该?必须?)是一个压缩的PNG.如何将Windows XP图标和这个新的Vista图标"加入"到一个.ico文件中?

Rob*_*obV 27

ImageMagick在其文档中有这方面的配方,请参阅FavIcon网页链接缩略图

基本上你运行以下:

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
Run Code Online (Sandbox Code Playgroud)

您可以根据需要修改此选项以包含更大的分辨率,并更改边框,透明度设置等内容.

  • 事实上,如果使用`-alpha remove`而不是`-alpha off`,你应该可以省略`-bordercolor white -border 0`. (5认同)
  • 从SVG转换我想知道你是否可以"首先转换为大图像"(如png),或者可能使用密度和调整大小过采样技巧:http://www.imagemagick.org/discourse-server/viewtopic.php? F = 1&T = 13585 (4认同)
  • 除了作者希望用SVG这样做.正如我在SVG中使用此命令的回答中指出的那样,完全破坏了结果图标的质量,因为imagemagick仅在光栅化后调整SVG的大小. (2认同)

Mal*_*eod 8

看起来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;
Run Code Online (Sandbox Code Playgroud)

但是上面不会在文件中给出8位和4位图标(我认为只有不再支持的旧版Windows才需要这些图标)如果你需要它们应该可以做更多的工作来完成它们.


Pol*_*ear 7

我一直在为同样的问题而苦苦挣扎。我有一个带有图标图像的 SVG,我需要icon.ico从中创建一个文件。让我描述一下我找到的解决方案:

步骤 1:确定文件中包含哪些分辨率icon.ico

对此没有明确的指导方针。甚至微软发布的软件也带有不一致的图标分辨率。对此有一个疑问。因此,我认为我们能做的最好的事情就是使用Nirsoft 的 IconsExtract。使用这样的工具,您可以检查流行的现代 Windows 程序的图标中包含的分辨率。

步骤 2:为要包含在文件中的每个分辨率创建 .png 文件icon.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
Run Code Online (Sandbox Code Playgroud)

但是,如果您仍然想使用 Inkscape,请使用以下命令:

inkscape.exe MyIconImage.svg -w 16 -h 16 -o 16.png
Run Code Online (Sandbox Code Playgroud)

一些答案还建议使用 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
Run Code Online (Sandbox Code Playgroud)

-compress jpeg用作ImageMagick 中特定问题的解决方法,如以下评论中所述。
您可以icon.ico使用以下命令查看有关创建的文件的详细信息:

magick.exe identify icon.ico
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)


hna*_*rat 6

我清理了Malcolm的解决方案,修复了一个bug,并使脚本输出tiffs,这样你就可以在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
Run Code Online (Sandbox Code Playgroud)


小智 6

magick convert in.jpg -define icon:auto-resize=16,48,256 -compress zip out.ico
Run Code Online (Sandbox Code Playgroud)

http://imagemagick.org/script/command-line-options.php#define

  • 我也会将 32 和 64 添加到大小列表中 - 然后我认为这对所有 Windows 操作系统都是完美的: (2认同)