0

CarrierWave 在 ActiveRecord 上做得非常棒,可以在我上传图像时调整图像大小 - 但我希望能够在处理图像时在我的 ActiveRecord 模型中记录图像是横向还是纵向 - 这可能吗?

4

2 回答 2

1

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

include CarrierWave::RMagick

def landscape? picture
  if @file
    img = ::Magick::Image::read(@file.file).first
    img.columns > img.rows
  end
end
于 2013-01-06T20:37:12.197 回答
1

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

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

你可以before_save在你的模型中使用它,就像在CarrierWave wiki 中的这个例子中一样,我已经稍微调整了:

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

它利用了 MiniMagickyield对图像进行进一步处理的事实,以避免再次加载图像。

于 2013-01-06T20:39:52.207 回答