0

CarrierWave は ActiveRecord を使用して、アップロード時に画像のサイズを変更する素晴らしい仕事をしています - しかし、画像が処理されているときに ActiveRecord モデルで画像が横向きか縦向きかを記録できるようにしたいのですが、これは可能ですか?

4

2 に答える 2

1

READMEから、以下を使用して画像の向きを確認できます。

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

これは、CarrierWave wikiのこの例before_saveのように、モデルので使用できます。

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

更新:アップローダーでそれを行うには、最善のアプローチがわかりません。1つのオプションは、カスタム処理メソッドを作成することです。

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が画像を処理してさらに処理するという事実を利用して、画像の2回目の読み込みを回避します。

于 2013-01-06T20:39:52.207 に答える
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 に答える