使用内存中的 RMagick 将 SVG 转换为 PNG

Converting SVG to PNG with RMagick in memory

我在使用 RMagick:

将 SVG 字符串转换为 PNG 字符串时感到很沮丧
def convert_svg_to_png(str)
  img = Magick::Image.from_blob(str) {
    self.format = 'SVG'
    self.background_color = 'transparent'
  }
  img.to_blob {
    self.format = 'PNG'
  }
end

我收到错误:'convert_svg_to_png': undefined method 'to_blob' for [ SVG 100x10 100x10+0+0 DirectClass 16-bit 167b]:Array)

我唯一的想法是 from_blob 之后的 img 实例不是 Magick::Image 实例(因为错误说它是 [ SVG ... :Array])。我还没有在网上找到任何具体回答在内存中将图像从 SVG 转换为 PNG 的问题。多次提及 to_blob 但没有可行的示例。

嗯,经过一些实验我发现我可以成功使用img.to_blob:

def convert_svg_to_png(str)
  img, data = Magick::Image.from_blob(str) {
    self.format = 'SVG'
    self.background_color = 'transparent'
  }
  img.to_blob {
    self.format = 'PNG'
  }
end

关键部分是img, data = Magick::Image...作业。

from_blob 的 RMagick doc 表示 from_blob returns 图像数组,所以我猜这应该有效:

arr = Magick::Image.from_blob(str)
str = arr[0].to_blob

.to_blob.from_blob 都是 return 图像数组。要得到你想要的,只需在图像数组上调用 .first,你应该得到你需要的。

def convert_svg_to_png(str)
  img = Magick::Image.from_blob(str) {
    self.format = 'SVG'
    self.background_color = 'transparent'
  }
  img.first.to_blob {
    self.format = 'PNG'
  }
end

虽然提供的答案确实有效,但在这种情况下,我发现在变量赋值期间解构数组比仅在生成的数组上调用 .first 更不清晰。希望这对您有所帮助!