应用裁剪方法后如何在carrierwave上生成两个版本的图像? Rails 5 app

时间:2017-06-06 09:12:21

标签: ruby-on-rails carrierwave

我有一个avatar_uploader.rb,它使用carrierwave创建上传头像的多个版本,并且还有一个裁剪方法。

  version :thumb do
    process :crop
    resize_to_fill(100, 100)
  end

  version :miniature do
    resize_to_fill(25, 25)
  end

  version :large do
    resize_to_limit(600, 600)
  end

  def crop
    if model.crop_x.present?
      resize_to_limit(600, 600)
      manipulate! do |img|
        x = model.crop_x.to_i
        y = model.crop_y.to_i
        w = model.crop_w.to_i
        h = model.crop_h.to_i
        img.crop!(x, y, w, h)
      end
    end
  end

问题是我在应用裁剪方法后需要两个版本。我想要一个缩小版的缩略版,它是原始文件的裁剪版本。

裁剪方法要求用户裁剪图像,需要通过视图调用以获取x,y,w,h属性。所以它应该只做一次。用户在两个版本中裁剪两次图像是没有意义的。

现在,如果我可以定义版本缩小以在thumb版本上应用resize_to_fill会很方便,但我不知道它的语法是什么。

我想写这个: -

  version :miniature do
    thumb.resize_to_fill(25, 25)
  end

但这只是一个错误,并说拇指未定义。

有没有办法实现这个目标?

更新: -

我认为我没有清楚地解释这个问题。

缩小版本会重新生成,但问题是裁剪不会改变原始文件。它只是创建了拇指版本。应用微型版本时,它会使原始文件小型化,而不是拇指版本。我想要与拇指版相同的裁剪,但在微型尺寸。理想情况下,我想在拇指版上应用微型版本。我不知道如何实现这一目标。希望现在更清楚了。

1 个答案:

答案 0 :(得分:1)

您需要在裁剪后在图片上调用recreate_versions!才能执行此操作。所以你可以这样做:

model.image.recreate_versions!(:miniature)

更新:

你似乎在:thumb上有一个裁剪,但是对于你想要的东西,我会建议原始的自定义裁剪,然后重新创建版本。 This Railscast from Ryan Bates解释得很清楚。

希望这有帮助!