在Ruby on Rails应用程序中使用MiniMagick将SVG文件转换为PNG时,如何保留透明背景?

cnjp1d6j  于 2023-02-12  发布在  Ruby
关注(0)|答案(1)|浏览(141)

我正在尝试用Minimagick自动转换SVG图像为PNG。我有一个Rails应用程序,我需要在那里自动转换上传的SVG文件。这个应用程序运行在Heroku上。这些SVG通常有一个透明的背景。
这是我正在使用的代码:

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  version :email do
    process :convert_to_png
    def full_filename (for_file = model.logo.file) 
      "#{model.friendly_id}-#{model.id}-logo-email.png"
    end 
  end 

  def convert_to_png
    manipulate! do |img|
      img = img.format 'png'
      img = img.density 300
      img = img.resize '800x400'
      img = img.background 'none'
    end
  end

end

这将创建一个宽度为800的png图像。但是,不应用属性background 'none'。原始图像具有透明背景,生成的转换图像具有白色背景。
我看到Minimagick调用Imagemagick的mogrify命令,我也找到了创建所需图像所需的命令,但我在将其转换为上传程序的函数时遇到了麻烦。在上传程序中以相同的顺序使用相同的参数是行不通的,因为如果没有首先调用img = img.format 'png'行,它会抛出错误。

mogrify -density 300 -background none -resize 400x200 -format png myfile.svg
ccrfmcuu

ccrfmcuu1#

**注:**我不使用这个库,所以所有这些都是从文档和源代码中收集的。如果这些对你不起作用,我会删除这篇文章,因为它太长了,无法发表评论。

以下是一些建议:
也许可以尝试combine_optionsMiniMagick::Image#combine_options接受多个选项,并从中构建一个命令。" 这更符合您所需的CLI调用

def convert_to_png
  manipulate! do |img|
    img.combine_options do |i|
      i.density 300
      i.background 'none'
      i.resize '800x400'
      i.format 'png'
    end 
  end
end

另一种选择是触摸 Metal 并生成该命令。

MiniMagick::Tool::Mogrify.new do |mogrify|
  mogrify << "input.svg"
  mogrify.density(300)
  mogrify.background('none')
  mogrify.resize('800x400')
  mogrify.format('png')
  mogrify << "output.png"
end
#=> `mogrify input.svg -density 300 -background none -resize 800x400 -format png output.png`

相关问题