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