ImageMagick 将黑色图像转换为不同的颜色

ImageMagick convert black image into a different colour

我正在尝试将黑色 SVG 图像转换为彩色图像。即用给定的颜色替换黑色。我试过:

convert -resize 256x256\> -fill 'red' original.svg -opaque black new.png

此类作品:

如您所见,它仍然有黑色边框。我该如何摆脱它?

我试图上传原始 SVG,但它不允许我(不接受格式)。但这是我直接做直线时的样子:

convert original.svg new.png

更新:我刚刚发现我可以在主 SVG 中设置填充和边框:

<svg stroke="red" fill="red" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">

但这并不理想,因为我需要打开 SVG,使用正则表达式编辑我想要的值,保存它,然后最后进行转换 - 有点啰嗦 :)

我正在测试的 SVG 是:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M633.82 458.1L494.97 350.78c.52-5.57 1.03-11.16 1.03-16.87 0-111.76-99.79-153.34-146.78-311.82-7.94-28.78-49.44-30.12-58.44 0-15.52 52.34-36.87 91.96-58.49 125.68L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM144 333.91C144 432.35 222.72 512 320 512c44.71 0 85.37-16.96 116.4-44.7L162.72 255.78c-11.41 23.5-18.72 48.35-18.72 78.13z"/></svg>

更新 2:

好吧,一个非常肮脏的 hack - 但似乎可以解决问题。在我的脚本中,我现在将 SVG 克隆到临时文件中,在其上 运行 sed 以更改 fill/stroke 颜色,然后转换为全尺寸的 PNG:

cp youtube-square.svg foo.svg
sed -i 's/<svg /<svg stroke="green" fill="green" /g' foo.svg
convert foo.svg foo.png

我觉得有点笨拙,但它似乎有效:)

在 Imagemagick 中,您可以将黑色 SVG 更改为红色 PNG,如下所示。在这里我使用你的 black.png 因为你没有提供 black.svg 文件。以下是Imagemagick的Unix语法。

convert black.png \
\( -clone 0 -fill red -colorize 100 \) \
\( -clone 0 -negate \) \
-compose over -composite \
black2red.png

您可以在使用 ImageMagic 转换之前对 SVG 执行 XSL 转换。

给定 XML (original.svg):

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">
  <!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) -->
  <path d="M633.82 458.1L494.97 350.78c.52-5.57 1.03-11.16 1.03-16.87 0-111.76-99.79-153.34-146.78-311.82-7.94-28.78-49.44-30.12-58.44 0-15.52 52.34-36.87 91.96-58.49 125.68L45.47 3.37C38.49-2.05 28.43-.8 23.01 6.18L3.37 31.45C-2.05 38.42-.8 48.47 6.18 53.9l588.36 454.73c6.98 5.43 17.03 4.17 22.46-2.81l19.64-25.27c5.41-6.97 4.16-17.02-2.82-22.45zM144 333.91C144 432.35 222.72 512 320 512c44.71 0 85.37-16.96 116.4-44.7L162.72 255.78c-11.41 23.5-18.72 48.35-18.72 78.13z"/>
</svg>

以及以下 XSL,其中我将填充和描边属性添加到 <svg> (convert.xsl):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
  exclude-result-prefixes="svg">
  <xsl:template match="svg:svg">
    <svg>
      <xsl:attribute name="fill">
        <xsl:value-of select="'red'"/>
      </xsl:attribute>
      <xsl:attribute name="stroke">
        <xsl:value-of select="'none'"/>
      </xsl:attribute>
      <xsl:for-each select="@*">
        <xsl:attribute name="{name()}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
      <xsl:copy-of select="node()"/>
    </svg>
  </xsl:template>
</xsl:stylesheet>

这个命令:

xsltproc convert.xsl original.svg | convert - new.png

将转换后的 SVG 通过管道传输到 ImageMagic 并生成 PNG。

您也可以在 XSL 中使用参数,因此这里是上面的变体:

一个参数被添加到 XSL。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
  exclude-result-prefixes="svg">

  <xsl:param name="fill" select="'red'" />
  
  <xsl:template match="svg:svg">
    <svg>
      <xsl:attribute name="fill">
        <xsl:value-of select="$fill"/>
      </xsl:attribute>
      <xsl:attribute name="stroke">
        <xsl:value-of select="'none'"/>
      </xsl:attribute>
      <xsl:for-each select="@*">
        <xsl:attribute name="{name()}">
          <xsl:value-of select="."/>
        </xsl:attribute>
      </xsl:for-each>
      <xsl:copy-of select="node()"/>
    </svg>
  </xsl:template>
</xsl:stylesheet>

并使用命令:

xsltproc --stringparam fill green convert.xsl original.svg | convert - new.png

可以将 PNG(和 SVG)的填充更改为绿色。