CarrierWave更新型号?

时间:2013-01-06 19:51:40

标签: ruby activerecord carrierwave

CarrierWave正在做一个非常棒的工作,ActiveRecord在我上传它们时调整图像大小 - 但是我希望能够在我的ActiveRecord模型中记录图像是否是横向或纵向,因为它正在被处理 - 这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以将此方法添加到您的上传器文件中:

include CarrierWave::RMagick

def landscape? picture
  if @file
    img = ::Magick::Image::read(@file.file).first
    img.columns > img.rows
  end
end

答案 1 :(得分:1)

README,您可以使用以下内容确定图片的方向:

def landscape?(picture)
  image = MiniMagick::Image.open(picture.path)
  image[:width] > image[:height]
end

您可以在模型的before_save中使用此功能,例如来自CarrierWave wiki的this example,我稍微调整了一下:

class Asset < ActiveRecord::Base
  mount_uploader :asset, AssetUploader

  before_save :update_asset_attributes

  private

  def update_asset_attributes
    if asset.present? && asset_changed?
      self.landscape = landscape?(asset)
    end
  end

  def landscape?(picture) # ... as above ...
end

更新:要在上传器中执行此操作,我不确定最佳方法。一种选择可能是编写自定义处理方法:

class AssetUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process :resize => [200, 200]

  private

  def resize(width, height)
    resize_to_limit(width, height) do |image|
      model.landscape = image[:width] > image[:height]
      image
    end
  end
end

利用MiniMagick方法yield进行进一步处理的事实,以避免第二次加载图像。