Подтвердить что ты не робот

Повторная обработка изображений различных версий в Carrierwave

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

Любые предложения?

4b9b3361

Ответ 1

Try

image.recreate_versions!

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

Ответ 2

Вам нужно позвонить 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

Ответ 3

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

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

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

  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

Ответ 4

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

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

Ответ 5

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

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

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