【问题标题】:Reprocessing images of different versions in Carrierwave在 Carrierwave 中重新处理不同版本的图像
【发布时间】:2011-07-05 04:23:00
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails image upload carrierwave


    【解决方案1】:

    试试

    image.recreate_versions!
    

    抱歉,在公共汽车上。我无法解释。

    【讨论】:

    • Model.all.each {|m| m.avatar.recreate_versions!} 如果您已将新版本添加到具有预先存在记录的模型中,效果会很好。
    • 您可能还需要致电模型上的save。至少我做到了。可能取决于您的应用程序配置......所以这样的事情对我有用:Model.all.each {|m| m.avatar.recreate_versions!; m.save! }
    • 无需道歉。正是我需要的。总线编码正常。
    【解决方案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
    

    【讨论】:

    • 这对我不起作用。有可能是因为我将图像存储在 SC3 上的雾中吗?
    • @kibaekr 对,你需要下载图像,重新处理,然后重新上传。
    • 对我来说做这样的事情有效:“image.recreate_versions!除非 image.blank?”循环内。我不必下载图像,我只是在控制台中完成的
    【解决方案3】:

    这个 HowTo 对我最有帮助(即使我不使用雾):

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

    我在我的模型上添加了一个 reprocess 方法,然后在我的 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

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

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 2020-04-08
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多