Обрезка несущей волны

У меня есть CarrierWave ImageUploader, который создает несколько версий исходного изображения, которые необходимо обрезать на основе значений в моей модели (crop_x, crop_y, crop_w и crorop_h).

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, либо в каком-то обратном вызове, который происходит до создания превью.


person Kyle Decot    schedule 20.07.2011    source источник
comment
Взгляните на эту stackoverflow.com/questions/5985079/   -  person makaroni4    schedule 05.08.2011
comment


Ответы (1)


Вы можете сделать что-то вроде этого:

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

Я запускаю код, эквивалентный этому, в одном из моих приложений.

person pupeno    schedule 19.01.2012
comment
Я думаю, у вас может быть небольшая опечатка, по которой первым model.crop_y должен быть model.crop_h - person Paul Pettengill; 21.08.2013
comment
ArgumentError (wrong number of arguments (1 for 3, 4, or 5)). Я думаю, ваш img.crop не такой, как мой ... - person Alex C; 09.08.2014
comment
@AlexC это crop из MiniMagick, возможно, вы используете RMagick или что-то еще - person faron; 06.03.2015
comment
@faron, спасибо, но этот вопрос для меня уже устарел: p. - person Alex C; 06.03.2015
comment
Для RMagick передайте аргументы для урожая: crop!(x, y, w, h) - person Artem Kalinchuk; 25.04.2016