CarrierWave 在 ActiveRecord 上做得非常棒,可以在我上传图像时调整图像大小 - 但我希望能够在处理图像时在我的 ActiveRecord 模型中记录图像是横向还是纵向 - 这可能吗?
问问题
545 次
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 回答