3

モデルの値 (crop_x、crop_y、crop_w、crop_h) に基づいてトリミングする必要がある元の画像のいくつかのバージョンを作成する CarrierWave ImageUploader があります。

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  ...
  version :t do
    process :cropper
    process :resize_to_fill => [75, 75]
  end
  ...
  def cropper
    manipulate! do |img| 
      img = img.crop "#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}"
      img
    end 
  end

end

私が抱えている問題は、設定がない場合にデフォルトのクロッピング値を計算する必要があることですが、このロジックをどこに置くべきかわかりません。これを私の Photo モデル (アップローダーがマウントされている) に before_validation で入れてみましたが、これはクロッパー関数が実行された後に呼び出されるようです。ImageUploader ファイル、またはサムが作成される前に発生するコールバックのいずれかである必要があると考えています。

4

1 に答える 1

10

次のようなことができます。

process :cropper

def cropper
  manipulate! do |img|
    if model.crop_x.blank?
      image = MiniMagick::Image.open(current_path)
      model.crop_w = ( image[:width] * 0.8 ).to_i
      model.crop_h = ( image[:height] * 0.8 ).to_i
      model.crop_x = ( image[:width] * 0.1 ).to_i
      model.crop_y = ( image[:height] * 0.1 ).to_i
    end
    img.crop "#{model.crop_w}x#{model.crop_h}+#{model.crop_x}+#{model.crop_y}"
  end 
end

アプリの 1 つで、それと同等のコードを実行しています。

于 2012-01-19T17:45:10.747 に答える