17

使用 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 个缩略图。我尝试了几种不同的技术都无济于事。

有什么建议么?

4

5 回答 5

54

尝试

image.recreate_versions!

对不起,在公共汽车上。我无法解释这一点。

于 2011-03-10T22:03:25.167 回答
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
于 2011-09-20T18:37:32.783 回答
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:导轨4.2

于 2015-07-04T12:19:29.117 回答
1

检查这个最新的 RailsCast:

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

裁剪图像的一个版本后,您可以计算其他版本的裁剪坐标,或者可能更容易,以与原始图像的其他版本相同的纵横比缩小裁剪图像

于 2011-12-04T07:24:08.053 回答
1

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

def reprocess_image
  image.reprocess(crop_x,crop_y,crop_w,crop_h)
  image.recreate_versions!
end
于 2011-04-30T17:09:47.740 回答