Обработка изображений разных версий в Carrierwave - PullRequest
17 голосов
/ 27 февраля 2011

Используя Carrierwave, я создал 3 версии аватара - оригинал, small_thumb и large_thumb, используя следующие строки:

process :resize_to_limit => [400, 400]  

   version :big_thumb do
     process :resize_to_limit => [80, 80]
   end

   version :small_thumb do
     process :resize_to_limit => [50, 50]
   end

Я добавил дополнительный метод в свой класс AvatarUploader:

def reprocess(x,y,w,h)
        manipulate! do |img|
            img.crop(x.to_i, y.to_i, w.to_i, h.to_i, true) 

            end
resize_to_limit(180,180)  
end

, который вызывается в моей модели после выполнения обновления:

attr_accessor :crop_x, :crop_y, :crop_w, :crop_h
after_update :reprocess_image, :if => :cropping?

def cropping?
    !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end

private

def reprocess_image
image.reprocess(crop_x,crop_y,crop_w,crop_h)

end

Мне удалось обрезать и изменить размер оригинальной версии, но я не могу обновить 2 эскиза вместе с ней. Я попробовал несколько разных техник, но безрезультатно.

Есть предложения?

Ответы [ 5 ]

54 голосов
/ 11 марта 2011

Попробуйте

image.recreate_versions!

Извините, в автобусе.Я не могу это объяснить.

3 голосов
/ 04 июля 2015

Этот HowTo был наиболее полезным для меня (даже если я не использую туман):

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Recreate-and-reprocess-your-files-stored-on-fog

Я добавил метод повторной обработки в свою модель, а затем вызвал его длякаждый цикл в моем задании по рейку:

  def reprocess
    begin
      self.process_photo_upload = true
      self.photo.cache_stored_file!
      self.photo.retrieve_from_cache!(photo.cache_name)
      self.photo.recreate_versions!
      self.save!
    rescue => e
      STDERR.puts  "ERROR: MyModel: #{id} -> #{e.to_s}"
    end
  end

Рейк:

task :reprocess_photos => :environment do MyModel.all.each{|mm| mm.reprocess} end

PS: Rails 4.2

3 голосов
/ 20 сентября 2011

Вам необходимо позвонить image.cache_stored_file!, прежде чем звонить recreate_versions!

Это странно, потому что сам метод вызывает это, если файл кэшируется, но по какой-то причине он не работает.

Так что это будет что-то вроде:

def reprocess_image
  image.reprocess(crop_x, crop_y, crop_w, crop_h)
  image.cache_stored_file!
  image.recreate_versions!
end
1 голос
/ 04 декабря 2011

проверьте эту последнюю версию RailsCast:

http://railscasts.com/episodes/182-cropping-images-revised

после обрезки одной версии изображения, затем вы можете либо рассчитать координаты обрезки для других версий, либо, возможно, проще уменьшить масштабобрезанное изображение с теми же пропорциями, что и у других версий исходного изображения

1 голос
/ 30 апреля 2011

Я не пробовал, но, возможно, что-то вроде.

def reprocess_image
  image.reprocess(crop_x,crop_y,crop_w,crop_h)
  image.recreate_versions!
end
...