CarrierWave正在做一个非常棒的工作,ActiveRecord在我上传它们时调整图像大小 - 但是我希望能够在我的ActiveRecord模型中记录图像是否是横向或纵向,因为它正在被处理 - 这可能吗?
答案 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
进行进一步处理的事实,以避免第二次加载图像。