2013-01-06 2 views
0

CarrierWave делает потрясающую работу с ActiveRecord, изменяя размеры моих изображений, когда я их загружаю, - но я хотел бы иметь возможность записывать, является ли изображение пейзажем или портретом в моей модели ActiveRecord при его обработке - возможно ли это?CarrierWave для обновления модели?

ответ

1

С README, вы можете использовать следующие определения ориентации изображения:

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

Вы могли бы использовать это в a before_save на вашей модели, например, в this example из вики-носителя CarrierWave, который я немного адаптировал:

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 изображение, для дальнейшей обработки, с тем чтобы избежать загрузки изображения во второй раз.

+0

Я дал этот снимок - он действительно работает, но для этого требуется загрузить изображение дважды, один раз для изменения размера и один раз, чтобы найти ширину и высоту - это похоже на плохое использование памяти! Невозможно ли получить эту информацию из загрузчика, а не из модели? –

+1

Да, это определенно возможно. Я добавил возможный подход к моему ответу. –

+0

awe- * Мне нужно написать больше символов * -которые –

1

вы можете добавить этот метод в файл загрузчика:

include CarrierWave::RMagick 

def landscape? picture 
    if @file 
    img = ::Magick::Image::read(@file.file).first 
    img.columns > img.rows 
    end 
end 
Смежные вопросы