Преобразование SVG в PNG с RMagick в памяти

Я трачу время на преобразование строки SVG в строку PNG с помощью RMagick:

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 ответа

Решение

Документ RMagick для from_blob говорит, что from_blob возвращает массив изображений, поэтому я предполагаю, что это должно работать:

arr = Magick::Image.from_blob(str)
str = arr[0].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... назначение.

.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 на сгенерированном массиве. Надеюсь это поможет!

Другие вопросы по тегам