Ответ 1
Try
image.recreate_versions!
Извините, на автобусе. Я не могу изложить это.
Используя 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 эскиза вместе с ним. Я пробовал несколько разных методов безрезультатно.
Любые предложения?
Try
image.recreate_versions!
Извините, на автобусе. Я не могу изложить это.
Вам нужно позвонить 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
Этот HowTo был наиболее полезен для меня (даже если я не использую туман):
Я добавил метод обработки в свою модель и затем вызвал его для каждого цикла в моей команде 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
Я не пробовал, но, возможно, что-то вроде.
def reprocess_image
image.reprocess(crop_x,crop_y,crop_w,crop_h)
image.recreate_versions!
end
проверьте этот последний RailsCast:
http://railscasts.com/episodes/182-cropping-images-revised
после обрезки одной версии изображения вы можете либо вычислить координаты обрезки для других версий, либо, возможно, проще, уменьшить обрезанное изображение с теми же пропорциями, что и другие версии исходного изображения