如何将方形 SVG 转换为全尺寸 ICO?

平面设计 墨景 图标 svg 网站图标
2021-12-28 23:09:50

我在 InkScape 中绘制了一个图标,并希望将其导出到一个 ICO 文件,该文件将包含所有合理分辨率(16x16、32x32、... 256x256 等)的精灵。如何做到这一点(不使用庞大而昂贵的软件,如 Photoshop、CorelDraw 等)?

4个回答

命令行解决方案:

  1. 使用 Inkscape将您的 SVG 导出master.svg为 PNG:
# Install on Ubuntu
sudo apt-get install inkscape
# Other systems: make sure Inkscape is in your PATH

inkscape -w 16 -h 16 -e 16.png master.svg
inkscape -w 32 -h 32 -e 32.png master.svg
inkscape -w 48 -h 48 -e 48.png master.svg
  1. 使用 ImageMagick 将 PNG 图像转换为 ICO:
# Install on Ubuntu
sudo apt-get install imagemagick

convert 16.png 32.png 48.png icon.ico
  1. 可选 - 确保您的 ICO 包含所有内容:
$ identify icon.ico
icon.ico[1] ICO 16x16 16x16+0+0 32-bit sRGB 21.2KB 0.000u 0:00.000
icon.ico[0] ICO 32x32 32x32+0+0 32-bit sRGB 21.2KB 0.000u 0:00.000
icon.ico[0] ICO 48x48 48x48+0+0 32-bit sRGB 21.2KB 0.000u 0:00.000

您可以立即使用ImageMagick

convert -density 384 icon.svg -define icon:auto-resize icon.ico

[编辑]

由于 ImageMagick 版本 7,您需要magick在命令前面添加(请参阅CLI 上的文档),因此命令行现在是:

magick -density 384 icon.svg -define icon:auto-resize icon.ico

您还可以查看此答案以获取更多信息: https ://stackoverflow.com/a/16922387/1603480

重击版本...

#!/bin/bash

set -ex

svg=$1

size=(16 32 24 48 72 96 144 152 192 196)

out="$(mkdir -d)"

echo Making bitmaps from your svg...

for i in ${size[@]}; do
  inkscape $svg --export-png="$out/$i.png" -w$i -h$i --without-gui
done

echo Compressing...

## Replace with your favorite (e.g. pngquant)
# optipng -o7 "$out/*.png"
pngquant -f --ext .png "$out/*.png" --posterize 4 --speed 1

echo Converting to favicon.ico...

convert "$out/*.png" favicon.ico

# Clean-up
rm -rf "$out/"

echo Done

用法: ./favicon.sh your-square-svg-file.svg

需要:包管理器中的 inkscape imagemagick optipng(可选)。

我发现为 bash shell 重新创建它更容易,因为 Win10 和 Inkscape 没有相处。这已在 Linux 的 Windows 子系统中进行了测试,但它也应该可以在 Mac 上运行。

使用此参考来选择我关心的尺寸:https ://github.com/audreyr/favicon-cheat-sheet 。根据您的特定需求调整size阵列。

我会建议这种方法:

1) 创建一个脚本以将 SVG 导出为任何所需的大小。我编写了这个 .bat 脚本来帮助我创建一个 Android 图标

@echo off
set file="%~f1"
set path=%~dp1
set inkscape="C:\Program Files\Inkscape\inkscape.exe"

echo Le icone saranno salvate in %path%
echo Produzione icone applicative

echo %file% --export-png="%path%/ic32.png" -w32 -h32 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic48.png" -w48 -h48 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic72.png" -w72 -h72 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic96.png" -w96 -h96 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic144.png" -w144 -h144 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic192.png" -w192 -h192 > %~dp1/commands.txt
echo %file% --export-png="%path%/ic512.png" -w512 -h512 > %~dp1/commands.txt
%inkscape% --shell < %~dp1/commands.txt
erase "%~dp1/commands.txt"

echo Procedura terminata

注意

  • 定义的%inkscape% var 应该足以满足您的 Inkscape 安装路径
  • 该脚本将所有导出命令回显到一个临时文件,以更好地管理inkscape 进程。“shell” cli 参数使用单个实例接受更多命令,而不是为每个命令生成一个实例。

使用此参数,Inkscape 将进入交互式命令行 shell 模式。在这种模式下,您在提示符下输入命令,Inkscape 会执行它们,而无需为每个命令运行一个新的 Inkscape 副本。此功能对脚本和服务器使用非常有用:它没有添加新功能,但允许您提高重复调用 Inkscape 执行命令行任务(例如导出或转换)的任何脚本的速度和内存要求。shell 模式下的每个命令都必须是完整有效的 Inkscape 命令行,但没有 Inkscape 程序名称,例如“file.svg --export-pdf=file.pdf”。见inkscape手册

2) 将philippe-b 答案中所述的转换语法添加到上述脚本中,它将所有生成的 PNG 合并到一个 ICO 文件中

3) (可选)删除所有导出的 PNG,因为它们不再需要