5

例如,在回形针中,当 .png 转换为 .jpg 时,可以添加此设置以设置白色背景:

:convert_options => { :all => '-background white -flatten +matte'}

一旦carrierwave也使用rmagick,该怎么做?

Obs.:我的文件存储在 S3 中。

我的代码:

version :square do
    process :resize_to_fill => [200, 200]
    process :convert => 'jpg'
end
4

4 回答 4

2

这是只进行转换和背景填充的更健全的版本

def convert_and_fill(format, fill_color)
  manipulate!(format: format) do |img|
    new_img = ::Magick::Image.new(img.columns, img.rows)
    new_img = new_img.color_floodfill(1, 1, ::Magick::Pixel.from_color(fill_color))
    new_img.composite!(img, ::Magick::CenterGravity, ::Magick::OverCompositeOp)
    new_img = yield(new_img) if block_given?
    new_img
  end
end

示例用法:

process convert_and_fill: [:jpg, "#FFFFFF"]
于 2017-02-28T06:00:04.067 回答
1

我已经解决了这个问题,但我不确定这是否是最好的方法:

def resize_to_fill(width, height, gravity = 'Center', color = "white")
    manipulate! do |img|
      cols, rows = img[:dimensions]
      img.combine_options do |cmd|
        if width != cols || height != rows
          scale = [width/cols.to_f, height/rows.to_f].max
          cols = (scale * (cols + 0.5)).round
          rows = (scale * (rows + 0.5)).round
          cmd.resize "#{cols}x#{rows}"
        end
        cmd.gravity gravity
        cmd.background "rgba(255,255,255,0.0)"
        cmd.extent "#{width}x#{height}" if cols != width || rows != height
      end
      ilist = Magick::ImageList.new
      rows < cols ? dim = rows : dim = cols
      ilist.new_image(dim, dim) { self.background_color = "#{color}" }
      ilist.from_blob(img.to_blob)
      img = ilist.flatten_images
      img = yield(img) if block_given?
      img
    end
  end
于 2012-07-12T04:20:47.360 回答
1

使用 MiniMagick,我可以这样做:

process :resize_and_pad => [140, 80, "#FFFFFF", "Center"]

于 2014-10-07T17:44:57.670 回答
1

我使用 MiniMagick 的解决方案:首先,在您的上传器上定义一个方法,将图像转换为 jpg 格式,同时删除 alpha 通道并将背景颜色设置为白色:

def convert_to_jpg(bg_color = '#FFFFFF')
  manipulate! do |image|
    image.background(bg_color)
    image.alpha('remove')
    image.format('jpg')
  end
end

然后添加一个将文件转换为 jpg 的新版本(也覆盖full_filename更改文件名扩展名的方法):

version :jpg do
  process :convert_to_jpg

  def full_filename(file)
    filename = super(file)
    basename = File.basename(filename, File.extname(filename))
    return "#{basename}.jpg"
  end
end
于 2019-04-30T16:32:59.880 回答