Carrierwave图像尺寸

Kin*_*nan 8 ruby ruby-on-rails rmagick carrierwave

如何获得当前载波实例的宽度和高度?

像这样的东西:

car_images.each do | image|
  image_tag( image.photo_url, :width => image.photo_width, :height => image.photo_height)
end
Run Code Online (Sandbox Code Playgroud)

不幸的是image.photo_width,image.photo_height并没有工作.我需要指定图像的宽度和高度,这是我正在使用的jquery插件所必需的.

小智 14

结合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,你得到:

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
Run Code Online (Sandbox Code Playgroud)


Jam*_*ieD 12

如果使用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
Run Code Online (Sandbox Code Playgroud)

在你的模型中:

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
Run Code Online (Sandbox Code Playgroud)

  • 这适用于新上传(`image_changed?== true`)但是如何测量现有附件的尺寸呢?我似乎无法从控制台访问`get_geometry`方法.我得到"`私有方法'文件'调用#<CarrierWave :: Storage :: Fog :: File:0x00000005225b28>`". (2认同)