使用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个缩略图。我尝试了一些不同的技术无济于事。
有什么建议吗?
答案 0 :(得分:54)
尝试
image.recreate_versions!
抱歉,在公共汽车上。我无法阐述这一点。
答案 1 :(得分:3)
您需要在致电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
答案 2 :(得分:3)
这个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
答案 3 :(得分:1)
我没有尝试,但可能会提出类似的东西。
def reprocess_image
image.reprocess(crop_x,crop_y,crop_w,crop_h)
image.recreate_versions!
end
答案 4 :(得分:1)
查看最新的RailsCast:
http://railscasts.com/episodes/182-cropping-images-revised
裁剪一个版本的图像后,您可以计算其他版本的裁剪坐标,或者可能更容易,缩小裁剪后的图像,使其具有与原始图像的其他版本相同的纵横比