2012-01-13 261 views
7

如何获取carrierwave当前实例的宽度和高度?Carrierwave图像尺寸

事情是这样的:

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

不幸的是image.photo_widthimage.photo_height不工作。 我需要指定图像的宽度和高度,它是我使用的jquery插件所必需的。如果使用Rmagick

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 

回答

13

结合https://github.com/jnicklas/carrierwave/wiki/How-to:-Get-version-image-dimensionshttps://github.com/jnicklas/carrierwave/wiki/How-to:-Store-the-uploaded-file-size-and-content-type,你会得到。在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 
11

您可以保存的高度和宽度属性与您的模型很容易:

+2

这适用于新上传('image_changed?== true'),但测量现有附件的尺寸又如何?我似乎无法从控制台访问'get_geometry'方法。我得到了''私人方法'文件',称为''“。 – 2013-10-11 22:36:25

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

我已经使用MiniMagick信息更新了https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Get-image-dimensions。 – 2014-07-29 18:31:14

1

或者只是使用FastImage。这使得追溯测量附件变得更容易。