【问题标题】:How to pass Magick::Image object to carrierwave uploader如何将 Magick::Image 对象传递给载波上传器
【发布时间】:2021-11-17 13:08:14
【问题描述】:

我正在使用 Magick 将 PDF 页面转换为图像,并使用 Carrierwave 进行文件存储管理。

这是我正在使用的方法,它有效:

  def convert_to_images
    user_cv_images.destroy_all
    Magick::ImageList.new(self.file.file.file) do
      self.quality = 100
      self.density = 144
      self.colorspace = Magick::RGBColorspace
      self.interlace = Magick::NoInterlace
    end.each_with_index do |image, index|
      tmp_file_path = "tmp/page-#{index}.png"
      image.resize_to_fit!(1600, 10000)
      image.write(tmp_file_path)
      user_cv_images.create(image: File.open(Rails.root.join(tmp_file_path), position: index + 1))
      File.delete(Rails.root.join(tmp_file_path))
    end
  end

困扰我的是,我将这些图像中的每一个都保存到 tmp/ 文件夹,以便将其传递给 Carrierwave 上传器。我很确定有更好的方法可以做到这一点,但我找不到它。

图像是Magick::Image 类的对象。

【问题讨论】:

标签: ruby-on-rails-5 carrierwave rmagick


【解决方案1】:

感谢Phil 和他的建议,这最终对我有用:

我在初始化程序中添加了 FileIO 助手:

#config/initializers/file_io.rb
class FileIo < StringIO
  def initialize(stream, filename)
    super(stream)
    @original_filename = filename
  end

  attr_reader :original_filename
end

FileIO = FileIo

现在我保存图像的方法如下:

  def convert_to_images
    user_cv_images.destroy_all
    Magick::ImageList.new(self.file.file.file) do
      self.quality = 100
      self.density = 144
      self.colorspace = Magick::RGBColorspace
      self.interlace = Magick::NoInterlace
    end.each_with_index do |image, index|
      image.resize_to_fit!(1600, 10000)
      user_cv_images.create(image: FileIO.new(image.to_blob, "page-#{index}.png"), position: index + 1)
    end
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2020-04-07
    • 2021-02-11
    • 1970-01-01
    • 2011-12-28
    • 2013-07-13
    相关资源
    最近更新 更多