Ruby on rails 在Carrierwave中重新处理不同版本的图像

Ruby on rails 在Carrierwave中重新处理不同版本的图像,ruby-on-rails,image,upload,carrierwave,Ruby On Rails,Image,Upload,Carrierwave,使用Carrierwave,我创建了3个版本的阿凡达-一个原创,一个小拇指和一个大拇指,使用以下行: 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] e

使用Carrierwave,我创建了3个版本的阿凡达-一个原创,一个小拇指和一个大拇指,使用以下行:

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个缩略图。我尝试了几种不同的技巧,但都没有用

有什么建议吗?

试试看

image.recreate_versions!

对不起,在公共汽车上。我无法对此进行详细阐述。

我没有尝试过,但可能会放一些类似的东西

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

您需要调用
image.cache\u存储的\u文件在调用
之前重新创建\u版本

这很奇怪,因为如果文件被缓存,方法本身会调用该函数,但由于某种原因,它无法工作

这大概是这样的:

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

查看最新的RailsCast:


裁剪一个版本的图像后,您可以计算其他版本的裁剪坐标,或者可能更简单,使用与原始图像的其他版本相同的纵横比缩小裁剪图像的比例。本指南对我最有帮助(即使我不使用雾):

我在我的模型上添加了一个重新处理方法,然后在我的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
耙子:


任务:重新处理照片=>:environment do
MyModel.all.each{| mm | mm.reprocess}
结束


PS:Rails 4.2

Model.all.each{m | m.avatar.reacreate|u versions!}
如果您已将新版本添加到具有预先存在记录的模型中,则将非常有效。您可能还需要在模型上调用
save
。至少我做到了。可能取决于您的应用程序配置。。。所以类似的东西对我来说很有用:
Model.all.each{m | m.avatar.reacreate|u versions!;m.save!}
无需道歉。正是我需要的。总线编码a-好的。这对我不起作用。可能是因为我正在用fog将图像存储在SC3上吗?@kibaekr对,你需要下载图像,重新处理,然后重新加载。对我来说,这样做很有效:“image.recreate\u versions!除非image.blank?”在循环中。我不需要下载图片,我只是在控制台上下载