2012-01-13 2 views
7

Как получить ширину и высоту текущего экземпляра несущей?Размер изображения несущей волны

Что-то вроде этого:

car_images.each do | image| 
    image_tag(image.photo_url, :width => image.photo_width, :height => image.photo_height) 
end 

К сожалению image.photo_width и image.photo_height не работают. Мне нужно указать ширину и высоту изображений, это необходимо для плагина jquery, который я использую.

ответ

13

Объединить https://github.com/jnicklas/carrierwave/wiki/How-to:-Get-version-image-dimensions и https://github.com/jnicklas/carrierwave/wiki/How-to:-Store-the-uploaded-file-size-and-content-type и вы получите:

class Image 
    before_save :update_image_attributes 

    private 

    def update_image_attributes 
    if image.present? 
     self.content_type = image.file.content_type 
     self.file_size = image.file.size 
     self.width, self.height = `identify -format "%wx%h" #{image.file.path}`.split(/x/) 
     # if you also need to store the original filename: 
     # self.original_filename = image.file.filename 
    end 
    end 
end 
11

Вы можете сохранить высоту и ширину, как атрибуты вашей модели довольно легко при использовании RMagick. В Carrierwave пользователя:

class ArtworkUploader < CarrierWave::Uploader::Base 

    def geometry 
    @geometry ||= get_geometry 
    end 

    def get_geometry 
    if @file 
     img = ::Magick::Image::read(@file.file).first 
     geometry = { width: img.columns, height: img.rows } 
    end 
    end 

end 

И в вашей модели:

class Artwork < ActiveRecord::Base 

    mount_uploader :image, ArtworkUploader 

    before_save :save_image_dimensions 

    private 

    def save_image_dimensions 
     if image_changed? 
     self.image_width = image.geometry[:width] 
     self.image_height = image.geometry[:height] 
     end 
    end 
end 
+2

Это работает для новых загрузок ('image_changed? == true'), но как насчет измерения размеров существующих вложений? Кажется, я не могу получить доступ к методу 'get_geometry' с консоли. Я получаю файл 'private private 'для # ' ". –

0

@ ответ JamieD работал для меня, но с одним исключением. Я использовал MiniMagick.

Поэтому я добавил что-то подобное моему загрузчику.

def geometry 
    @geometry ||= get_geometry 
end 

def get_geometry 
    if @file 
    img = ::Magick::Image::read(@file.file).first 
    geometry = { width: img.columns, height: img.rows } 
    end 
end 
+0

Я обновил https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Get-image-dimensions с информацией MiniMagick. –

1

Или просто используйте FastImage. Это значительно упрощает измерение привязки задним числом.

Смежные вопросы