28

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

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

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

4

10 回答 10

32

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

您可以根据需要对其进行修改以包含更大的分辨率,并更改边框、透明度设置等内容。

于 2013-02-27T05:40:12.640 回答
9
magick convert in.jpg -define icon:auto-resize=16,48,256 -compress zip out.ico

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

于 2016-01-23T01:20:50.937 回答
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;

但是,上面不会在文件中为您提供 8 位和 4 位图标(我认为这些仅适用于不再受支持的旧 Windows 版本)如果您需要它们,应该可以做更多的工作来完成这些.

于 2013-02-26T21:38:22.290 回答
7

我清理了 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
于 2014-05-15T21:20:51.220 回答
4

这是常见问题解答中的标准配方,已修改为具有msdn 链接中提到的所有分辨率(“其他尺寸...”下的那些分辨率除外)(其他答案没有所需的所有分辨率)

 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
于 2013-06-20T18:01:14.367 回答
3

基于所有先前的答案并更正以下错误:

  • 不要使用-color=256,因为您需要所有尺寸的 32 位彩色版本和现代 Windows 版本 (Vista+)
  • Windows 中的必要大小为16、24、32、48、64、128、256。大多数脚本都忘记了这些。我不确定是否真的需要 96,但这并没有什么坏处。
  • 您需要为尺寸 16、24、32 和 48 包括 4 位和 8 位调色板版本(显然是为了特别支持远程桌面应用程序)

多合一 bash 脚本(从 开始logo.svg并生成logo.ico):

#!/bin/bash

for size in 16 24 32 48 64 96 128 256; do
    inkscape -z -e $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 
于 2018-10-03T22:42:06.190 回答
2

Bash one-liner 转换logo.svglogo.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

Malcolm MacLeod 的回答启发,但避免了显式循环和临时文件。

stderr重定向是为了避免 Inkscape 的成功消息stdout(“Bitmap 另存为:/dev/stdout”)最终出现在图像数据中。

于 2017-04-03T15:14:38.043 回答
2

我一直在努力解决同样的问题。我有一个带有图标图像的 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
}
于 2021-10-07T20:10:30.463 回答
1

修改 hnasarat 对 windows 用户的回答。最简单的方法是使用Chocolatey安装 InkScape 和 ImageMagick ,然后在批处理文件中运行以下命令。(它不像您在一个 svg 中传递的其他答案那样灵活,但它会抽出Favicon Cheat Sheet中推荐的所有 favicon 。

@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
于 2015-03-01T08:55:32.847 回答
0

在保持纵横比的同时从 SVG 创建 ICO 文件:

  1. 寻找 SVG 比例(例如 1920x1080)
  2. 对于最大 256px 宽的图标,按比例:[1920:1080=256:x] -> x=(1080*256)/1920=144
  3. 最后,使用 ImageMagickconvert命令:

    转换 -background none -resize 256x144 -gravity center -extent 256x144 image.svg image.ico

于 2019-10-08T21:20:16.540 回答