ChatGPT解决这个技术问题 Extra ChatGPT

使用 ImageMagick 将 SVG 转换为具有抗锯齿功能的透明 PNG

我想将 SVG 图像转换为具有透明背景和抗锯齿边缘的 PNG 文件(使用半透明像素)。不幸的是,我无法让 ImageMagick 进行抗锯齿,边缘看起来总是很糟糕。这是我尝试过的:

convert +antialias -background transparent  in.svg -resize 25x25 out.png

我可以使用任何想法或不同的命令行工具吗?


M
Micah

作为旁注,我发现获得透明度有点棘手。我不得不使用透明,而不是使用透明。

convert -background none in.svg out.png

至少在这个时候(6.8.6),它也适用于透明。
“无”和“透明”都为我创建了不透明的白色背景。不透明。我在 Mac 上使用 6.8.8-3
-background none 为我工作,Mac 上的 ImageMagick 6.8.6-6
@petrsyn 虽然该命令将接受输入图像路径作为第一个参数(例如 convert in.svg -background none out.png,但我发现此排序无法使背景透明;它导致不透明的白色背景!确保 in.svg 和 { 3} 是命令中的最后两个参数
根据图像魔术 color names documentation-background none 确实是正确的:“还有一种颜色称为 'none',它是完全透明的。这种颜色是 rgba(0, 0, 0, 0.0) 的简写。”
h
halfer

Inkscape 会这样做:

inkscape \
    --export-png=out.png --export-dpi=200 \
    --export-background-opacity=0 --without-gui in.svg

更新

术语有 changed:所有导出参数都抑制 gui,并且输出参数现在只是基于文件类型。例如,png 类型将导致 /path/to/picture.svg 中的文件导出为 /path/to/picture.png(注意:这会覆盖输出)。

inkscape \
    --export-type=png --export-dpi=200 \
    --export-background-opacity=0 picture.svg

注意引用的 wiki 在 --export-type=png 上有引号,这是不正确的。

另外,如果没有 Inkscape 命令行,MacOS 可以直接通过 bash 访问:

/Applications/Inkscape.app/Contents/MacOS/inkscape

我发现的第一个解决方案保留了一些 SVG 的调色板,例如 Apache NiFi (nifi.apache.org/assets/images/apache-nifi-logo.svg) 的徽标。
如果系统上安装了 Imagemagick,现在将使用 Inkscape。您可以选择:Inkscape(如果在系统上)、RSVG 委托(必须与 Imagemagick 一起安装,或者 Imagemagick 内部的 MSVG/XML。
“SVG 文件名之前的供应-background none”答案要好得多,因为它实际上使用 ImageMagick,该工具询问...:stackoverflow.com/a/18579465/1901658
@FredrickBrennan:我的一般观点是读者(和问题作者)将使用能够为他们提供最佳结果的工具。如果制作的 OP 询问如何用螺丝刀敲钉子,有时建议使用锤子的答案是最好的,即使它“不是他们要求的”。
好吧,既然用户说他们需要命令行工具,我假设涉及服务器,并且 ImageMagick 更容易在服务器上运行更容易,不需要一点 Xorg 依赖项。但是,是的,好的。
s
sleeper

实际上,阅读 imagemagick 文档:

-antialias 在绘制字体和线条时启用/禁用抗锯齿像素的渲染。默认情况下,对象(例如文本、线条、多边形等)在绘制时会消除锯齿。使用 +antialias 禁用添加抗锯齿边缘像素。然后,这会将添加到图像的颜色数量减少为仅直接绘制的颜色。也就是说,在绘制此类对象时不会添加混合 > 颜色。

+antialias 确实会禁用抗锯齿。


他们倒过来了:|
C
Community

我学习如何做到这一点的方法是从这里找到的方法:How to convert a .eps file to a high quality 1024x1024 .jpg?

这与 @halfer 使用 inkscape 的解决方案的想法相同——首先提升 DPI——但您可以使用 -density 选项在 imagemagick 中完成同样的事情。

convert -density 200 in.svg -resize 25x25 -transparent white out.png

此解决方案虽然可能适用于许多 SVG 文件,但不如 -background none 解决方案,因为白色是许多 SVG 中可能存在的有效填充/描边颜色,这会使所有白色像素透明,即使是那些定义为白色填充/描边。
Y
Yurii Rabeshko

在我的情况下,添加 -transparent white 选项特别解决了问题,因为背景没有完全移除(不幸的是,存在浅色阴影)。所以我使用恕我直言,更清晰的解决方案,完全去除背景与ImageMagic:

convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png

它通过 RGBA 通道设置完全透明的黑色作为背景。


这是 -transparent 选项的相关文档:imagemagick.org/script/command-line-options.php#transparent
在摆弄了一段时间之后,这是让它工作的唯一方法 - 非常感谢!
-background none 在最近的 IM 版本中同样有效,如果目标是 PNG,则无需提供 -channel rgba
h
halfer

对我来说,适用于 svg 到 png:

convert ${src} \
    -transparent white \
    -background none \
    -resize 345x345 \
    res/drawable-xxxhdpi/${dest}

没有理由同时提供-transparent white-background none,这将对具有假定为白色的前景元素的文件产生负面影响。仅提供 -background none
W
WoodrowShigeru

如果我将 -resize 替换为 -scale,我会得到更好的、已经很好的抗锯齿结果。然后,甚至不需要 antialias 标志。


C
C Würtz

我添加一个矩形作为背景。嵌入 CSS 隐藏背景。然后我捕捉它的颜色来设置 ImageMagick 的透明属性。

SVG 文件:

<?xml version="1.0" ?>
<!DOCTYPE svg  PUBLIC '-//W3C//DTD SVG 1.1//EN'  'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
<svg 
    version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
    width="500px" height="500px"
    viewBox="0 0 500 500" 
    enable-background="new 0 0 500 500" 
    >
<defs>
    <style>
        #background { display: none; }
    </style>
</defs>
<rect id="background" x="0" y="0" width="500" height="500" fill="#e8e437"/>
<!-- beginning of the sketch -->
<g fill="#000" text-anchor="middle"font-size="112">
    <text y="350" x="192">OK</text>
</g>
<!-- end of the sketch -->
</svg>

bash 脚本

#!/bin/bash


BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )
SVG_DIR="$BASE_DIR/import"
PNG_DIR="$BASE_DIR/export"

for f in `ls $SVG_DIR/*.svg`
do
    g="$PNG_DIR/$(basename "$f" .svg).png"
    BGCOLOR=`grep 'id="background"' $f \
        | sed 's/.* fill="\([^"]*\)".*/\1/'`

    convert $f -transparent "$BGCOLOR" $g
done

鲁布·戈德堡会感到自豪。
对不起@FredrickBrennan,我不明白。您是否尝试过在 Imagick 上没有背景矩形?
是的,您只需要 convert-background none 选项。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅