如何使用 MiniMagick 将 SVG 渲染为 PNG 不忽略大小和字体选项?
How to make SVG to PNG rendering with MiniMagick not ignore size and font options?
我正在使用 minimagick
将 SVG 图像动态调整为 PNG 图像。
这是我的代码:
require "mini_magick"
svgString = '<?xml version="1.0" encoding="UTF-8"?>'\
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0, 0, 512, 512">'\
'<g id="Calque_1">'\
' <g>'\
' <path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill="#FFFFFF"/>'\
' <path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill-opacity="0" stroke="#000000" stroke-width="1"/>'\
' </g>'\
' <text transform="matrix(1, 0, 0, 1, 179.125, 208)">'\
' <tspan x="-28.125" y="10.5" font-size="24" fill="#000000">Is this using my font?</tspan>'\
' </text>'\
' </g>'\
'</svg>'
image = MiniMagick::Image.read(svgString)
image.combine_options do |b|
b.resize "760x760"
b.font "/Users/foo/Library/Fonts/myFont.ttf"
end
image.format("png", 1)
image.write('from-string.png')
图像已渲染,但它是 512x512 图像(视口大小),渲染中未使用字体 myFont
。
知道如何解决这个问题吗?
不确定这是否有助于调试您的问题,但如果您从 SVG
字符串周围删除特定于语言的内容并将其保存在名为 image.svg
的文件中,您可以对其进行测试使用 ImageMagick 的命令行版本:
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0, 0, 512, 512">
<g id="Calque_1">
<g>
<path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill="#FFFFFF"/>
<path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill-opacity="0" stroke="#000000" stroke-width="1"/>
</g>
<text transform="matrix(1, 0, 0, 1, 179.125, 208)">
<tspan x="-28.125" y="10.5" font-size="24" fill="#000000">Is this using my font?</tspan>
</text>
</g>
</svg>
像这样:
convert -resize 760x760 -font "AdobeDevanagariBI" image.svg image.png
你得到这个:
其中 是 使用我指定的字体(我没有你的字体)并且 是 也是 760x760。
希望对您有所帮助。我的推断是您的 ImageMagick 已过时,或者 MiniMagick 有错误。抱歉,我不知道如何调试 MiniMagick - 你能看到它实际上在做什么吗?有调试器吗?
版本:ImageMagick 6.9.1-10 Q16 x86_64 2015-08-06 http://www.imagemagick.org
我找到了一种通过 mini_magick
获得我想要的东西的方法
(仅适用于版本 4+):
# Write SVG in a temporary file
temp_svg = Tempfile.new('bar')
temp_svg.write(svg_string)
temp_svg.close
MiniMagick::Tool::Mogrify.new do |mogrify|
mogrify.resize "760x760"
mogrify.font "/Users/foo/Library/Fonts/myFont.ttf"
mogrify.format "png"
mogrify << temp_svg.path
end
temp_svg.unlink
# The result is in (temp_svg.path + ".png")
它非常丑陋,因为我需要访问 SVG 和 PNG 的文件系统。但这是我让它发挥作用的唯一方法。
我正在使用 minimagick
将 SVG 图像动态调整为 PNG 图像。
这是我的代码:
require "mini_magick"
svgString = '<?xml version="1.0" encoding="UTF-8"?>'\
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0, 0, 512, 512">'\
'<g id="Calque_1">'\
' <g>'\
' <path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill="#FFFFFF"/>'\
' <path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill-opacity="0" stroke="#000000" stroke-width="1"/>'\
' </g>'\
' <text transform="matrix(1, 0, 0, 1, 179.125, 208)">'\
' <tspan x="-28.125" y="10.5" font-size="24" fill="#000000">Is this using my font?</tspan>'\
' </text>'\
' </g>'\
'</svg>'
image = MiniMagick::Image.read(svgString)
image.combine_options do |b|
b.resize "760x760"
b.font "/Users/foo/Library/Fonts/myFont.ttf"
end
image.format("png", 1)
image.write('from-string.png')
图像已渲染,但它是 512x512 图像(视口大小),渲染中未使用字体 myFont
。
知道如何解决这个问题吗?
不确定这是否有助于调试您的问题,但如果您从 SVG
字符串周围删除特定于语言的内容并将其保存在名为 image.svg
的文件中,您可以对其进行测试使用 ImageMagick 的命令行版本:
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0, 0, 512, 512">
<g id="Calque_1">
<g>
<path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill="#FFFFFF"/>
<path d="M256,432.5 C143.61,432.5 52.5,345.867 52.5,239 C52.5,132.133 143.61,45.5 256,45.5 C368.39,45.5 459.5,132.133 459.5,239 C459.5,345.867 368.39,432.5 256,432.5 z" fill-opacity="0" stroke="#000000" stroke-width="1"/>
</g>
<text transform="matrix(1, 0, 0, 1, 179.125, 208)">
<tspan x="-28.125" y="10.5" font-size="24" fill="#000000">Is this using my font?</tspan>
</text>
</g>
</svg>
像这样:
convert -resize 760x760 -font "AdobeDevanagariBI" image.svg image.png
你得到这个:
其中 是 使用我指定的字体(我没有你的字体)并且 是 也是 760x760。
希望对您有所帮助。我的推断是您的 ImageMagick 已过时,或者 MiniMagick 有错误。抱歉,我不知道如何调试 MiniMagick - 你能看到它实际上在做什么吗?有调试器吗?
版本:ImageMagick 6.9.1-10 Q16 x86_64 2015-08-06 http://www.imagemagick.org
我找到了一种通过 mini_magick
获得我想要的东西的方法
(仅适用于版本 4+):
# Write SVG in a temporary file
temp_svg = Tempfile.new('bar')
temp_svg.write(svg_string)
temp_svg.close
MiniMagick::Tool::Mogrify.new do |mogrify|
mogrify.resize "760x760"
mogrify.font "/Users/foo/Library/Fonts/myFont.ttf"
mogrify.format "png"
mogrify << temp_svg.path
end
temp_svg.unlink
# The result is in (temp_svg.path + ".png")
它非常丑陋,因为我需要访问 SVG 和 PNG 的文件系统。但这是我让它发挥作用的唯一方法。