将SVG图像批量转换为所需大小的PNG或ICO


26

我有一堆SVG图标,我想将其用于在VB.Net 2010中开发的应用程序,并且由于它不支持处理SVG图标,因此我需要将这些图标转换为PNG或ICO,输出分辨率。我在Ubuntu上找到了这样的命令行工具rsvgconvert。我们也有适用于Windows的此类工具吗?

Answers:


12

ImageMagick具有可用于Linux和Windows(及其他)的命令行工具。转换工具通常称为“转换”。这是一些使用说明文件

在这里您可以获取Windows安装程序


您还可以通过Linux的Windows子系统(WSL)以及apt install imagemagick
antonyh

(这适用于linux,可能适用于Windows)如果在IM上启用-verbose,则IM本身似乎使用inkscape来创建中间的eps文件。因此,我建议@zetah给出答案
Northern-bradley

这是一个适用于Windows的基于ImageMagick的小型转换器:fosshub.com/SVG2PNG.html它很旧(自2014年以来),但仍然有效,您无需阅读任何文档。
6

20

ImageMagick不应立即与任何涉及图像的批处理任务相关联。特别是在ImageMagick不能很好地解决SVG转换的情况下。

最好在命令行上尝试Inkscape

inkscape in.svg --export-png=out.png


8
为什么说inkscape比ImageMagick好?我不同意(或同意),只是对更多细节感到好奇。
山姆

原因是imageMagick更适合于处理png,jpg等。而inkscape更适合于处理矢量图像(svg)
user93 2016年

1
就目前而言,这不能回答有关批量转换的问题,对吗?
OR Mapper

尽管答案可行,但在Windows上,InkScape坚持延迟显示吸引焦点的启动屏幕,这使得无法在后台以批处理模式运行此屏幕。
Timwi

@Timwi在这里不会发生。只要记住使用该-z选项即可。
Svish

5

命令行开箱即用,我还想转换100个文件。这是我如何在Windows 7上使其工作:

  1. 安装inkscape-不是便携式的!

  2. 将所有svg文件复制到一个文件夹中,例如:“ C:\ svgs \”:

  3. convert.bat使用以下行创建文件:

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (指向安装的正确文件夹):

  4. 以管理员身份打开CMD!为此,请按WIN键,键入cmd,右键单击“ cmd.exe”,然后选择“以管理员身份运行”。

  5. 导航到“ C:\ svgs \”并输入convert.bat -所有svg文件都将转换为PNG。

  6. 使用Windows资源管理器搜索转换后的PNG文件。在我的PC上,它们位于以下文件夹中:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

希望能有所帮助。


由于只能在我所看到的范围内固定设置命令行的分辨率,因此最终使用了InkscapeBatch工具。在那里,我可以设置DPI以相对增加所有图像。

您需要指定正确的设置,否则将无法使用。这是我所做的:

在此处输入图片说明

在此处输入图片说明

点击“完成”后,您需要在工具栏中按下“启动批处理转换器...”按钮:

在此处输入图片说明


1
您的批处理命令可能缺少另一个%%A(作为输入文件名)。另外,为什么您认为它仅应在管理员模式下工作?
OR Mapper

那么这比使用ImageMagick更好吗?
reinierpost

可悲的是,该链接似乎也已消失。(2017
Ideogram

@Ideogram我找到了下载的另一个提供商。softsea.com/download/InkscapeBatch.html
Kai Noack

要指定dpi,您需要添加此选项--export-dpi=100,其中100是dpi的值
Xsmael


3

对于SVG到PNG的转换,我发现cairosvg(https://cairosvg.org/)的性能优于ImageMagick。在目录中所有文件上安装和运行的步骤。

pip3 install cairosvg

在包含.svg文件的目录中打开python shell并运行:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

这也将确保您不会覆盖原始的.svg文件,但会保持相同的名称。然后,您可以使用以下命令将所有.png文件移动到另一个目录:

$ mv *.png [new directory]

这个答案是唯一适用于我的相当大的SVG文件的答案,谢谢!!!
Ben Sandeen

1

经过了将近2个小时的搏斗,我选择了Inkscape。由于需要批量转换许多不同分辨率的文件,因此我创建了Powershell脚本。使用106个SVG,我的计算机冻结了大约5秒钟,因此在使用时要小心。

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}

我的冰冻了几秒钟。该&操作员启动一个新的进程,并立即继续进行,因此该脚本将许多新inkscape.exe过程,你有SVG文件创建。事实证明,这会使您的计算机缓慢运行一段时间。
罗里

如果您将它放在| Out-Null以该行开头的行的末尾,&将强制其一次运行inkscape.exe命令,这对我来说要好得多。
罗里

1

您可以在Bash / Ubuntu for Windows中的SVG所在的文件夹中使用以下命令。但是,似乎ImageMagick首先栅格化然后调整大小,这会导致奇怪的伪像……

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

另请参阅此处的基于Inscape的解决方案,它似乎运行良好(从另一个线程开始,链接丢失): 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;


1
+1我在一个非常简化的版本中将它与inkscape一起使用,find -name "*.svg" -exec inkscape {} -e {}.png \;尽管我更喜欢该版本:ls | grep ".svg" | xargs -I file inkscape file -e file.png因为文件是按字母顺序处理的,使用时则不是这种情况find
love.by.Jesus


0

我找不到一个可以运行批处理的命令,因此我通过生成文件列表并创建一系列命令来使其正常工作。这些说明应适用于所有版本的Windows。所有键入说明均排除引号,并包括引号之间的所有内容。

为此,您将需要Inkscape,MS Excel或类似的电子表格编辑器以及列表生成器。这里有一个很棒的免费软件列表生成器:https : //www.portablefreeware.com/?id=1171

  • 硬链接,将所有svg文件复制或移动到一个文件夹中。
  • 生成该文件夹的文件列表,然后导出到csv。
  • 在Excel中打开csv,然后删除除“文件名”列之外的所有列。还要删除底部的[Path]和摘要文本之类的列标题。
  • 如果文件名不在第二列中,则将其剪切并粘贴到此处。
  • 在第一列的第一个单元格中,键入inkscape,后跟一个空格和文件夹路径,其中svg文件将在其中包含一个反斜杠(例如“ inkscape C:\ SVG \”)。然后复制该单元格,选择其下方文件名之前的所有单元格并粘贴,以使它们都具有相同的文本。
  • 在第三列中,在第一个单元格中键入--export-png =,然后输入您要保存它们的目标文件夹。我只是使用了同一文件夹。为了使语法正确,请确保在开头添加一个空格,但将其余文本放在一起(例如“ --export-png = C:\ PNG \”)。复制并粘贴所有行,就像第一列一样
  • 复制整个第二列并将其粘贴到第四列。选择第四列后,按Ctrl + H(查找和替换)。在查找字段中键入“ .svg”。在替换字段中键入“ .png”,然后选择“全部替换”。

如果正确完成此操作,则每个文件名都应有一行,如下所示:| inkscape C:\ SVG \ | Filename1.svg | --export-png = C:\ PNG \ | Filename1.png |

  • 在第五列的第一个单元格中键入“ = concatenate(a2,b2,c2,d2)”。假设标题列尚未删除。括号中的单元格编号应与当前行号一致。如果您的第一个文件名位于B2中,则上述公式正确无误。否则更正,方括号中的单元格名称与第一个文件名的行匹配(例如a1,b1,c1 ...)
  • 复制并粘贴此单元格以填充其下方的所有内容,就像第1列和第3列一样。
  • 现在,复制整个第五列,并使用“选择性粘贴”>“值”将公式生成的文本粘贴到第六列中。第六栏是您的钱。复制整个第六列,打开记事本并将最后一列粘贴到其中。如果正确完成此操作,您将只有一个命令行将每个svg文件转换为png。
  • 将记事本文件作为批处理文件保存到Inkscape目录中。当“另存为”窗口打开时,将“另存为”类型更改为“所有文件”,并将其另存为.bat文件(例如,“ C:\ Program Files \ Inkscape \ SVGBatch.bat”
  • 剩下要做的就是进入该文件夹,然后双击刚刚保存的批处理文件。它应该打开命令提示符并转换所有文件。

希望这会使某人的生活更轻松。詹姆士


0

凯的答案很接近,但对我没有用。但是,经过一些微调,这在第一次就可以完美地工作了:

  1. 将SVG复制到方便的位置
  2. 在同一文件夹中创建一个文本文件并重命名 convert.bat
  3. convert.bat在您喜欢的文本/代码编辑器中打开,然后输入以下内容:

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

(请注意,该inkscape.exe位置应与您的PC上的可执行程序位置相匹配;第二个位置--export-png%%A-这是要转换的SVG文件)

  1. 双击convert.bat运行,它将回显转换结果。

请注意,您可能需要刷新Windows文件夹才能看到新文件,但是它们都应该在与原始SVG相同的位置创建。


0

由于某种原因,无法使imagemagick或inkscape为我工作。我只有12个文件要转换,而只是手动使用了该站点:http : //svgtopng.com/确实很不错。


0

这是一个基于ImageMagick的解决方案,可将给定目录中的所有svg文件转换为ico文件:

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

说明:

  • mogrify:与相似convert,但允许您批量处理多个文件。
  • -format ico:我们的目标文件格式。创建.ico文件而不是覆盖原始文件(默认情况下,mogrify会这样做)。
  • -density 1200:由于我们无法指定ImageMagick栅格化SVG的目标像素大小(它将首先以默认密度栅格化然后缩放),因此我们以极高的分辨率(1200dpi)栅格化SVG,以确保图像将缩小为256x256,而不是放大。
  • -background transparent:背景将呈现为透明。
  • -trim:删除图像周围的现有边框。
  • -resize 256x256:缩放图像,确保最长的一面具有256px,并保持宽高比。
  • -gravity center -extent 256x256:放大画布,确保短边也有256像素。现有图像是居中对齐的。这是必要的,因为我们需要一个正方形图像作为ICO文件的基础。
  • -define icon:auto-resize:在ICO文件中不仅包括256x256图像,还包括所有建议的缩小分辨率(例如32x32)。

0

此处给出的大多数答案都忽略了问题中所需大小的部分。使用convert“升级” SVG时,无法获得令人满意的结果。inkscape可以做得更好,并且可以保留背景透明性。

根据您的用例,使用以下选项之一:

  1. 以指定的DPI导出: inscape in.svg -d 300 -e out.png
  2. 以指定的宽度导出(保持宽高比): inscape in.svg -w 800 -e output.png
  3. 以指定的高度导出(保持宽高比): inscape in.svg -h 600 -e output.png

请注意,指定宽度和高度也不会保留宽高比。

要一次转换许多文件,请针对您的用例(bash兼容或兼容)调整以下内容:

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.