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)的填充更改为绿色。
我正在尝试将黑色 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)的填充更改为绿色。