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

时间:2016-03-17 11:51:16

标签: ruby svg png rmagick

我在使用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)

我唯一的想法是img之后的from_blob实例不是Magick::Image实例(因为错误表明它是[ SVG ... :Array])。我还没有找到任何在线内容,具体地解答将图像从SVG转换为内存中的PNG。很多提及to_blob但没有可行的例子。

3 个答案:

答案 0 :(得分:3)

好吧,经过一些实验,我发现我可以成功使用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...作业。

答案 1 :(得分:2)

from_blob的RMagick doc表示from_blob会返回一个图像数组,所以我猜这应该可行:

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

答案 2 :(得分:0)

.to_blob.from_blob都返回一组图片。要获得您想要的效果,只需在图像阵列上调用.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更不易读。希望这有帮助!