保存图像Paperclip中的尺寸(宽度和高度)?

The*_*xit 31 ruby-on-rails paperclip ruby-on-rails-3

任何Paperclip向导都知道你是否可以在使用Paperclip保存图像时,还可以将图像尺寸(宽度和高度)保存在2个额外的字段中?如何在Paperclip上传过程中获得此类数据?

Nik*_*bak 61

仅仅为了完整起见,即使先前的答案已经显示出足够好的建议.

您可以使用Paperclip事件处理程序而不是Rails回调.在这种情况下,仅在图像更改时才会重新计算大小.(如果你使用S3进行存储,这可以节省很多时间)

has_attached_file :image, :styles => ...
after_post_process :save_image_dimensions

def save_image_dimensions
  geo = Paperclip::Geometry.from_file(image.queued_for_write[:original])
  self.image_width = geo.width
  self.image_height = geo.height
end
Run Code Online (Sandbox Code Playgroud)

甚至不必从S3下载图像(或从文件中读取),paperclip将其提供给事件处理程序本身.

有关详细信息,请参阅自述文件的事件部分.


Jus*_*ner 5

当用户使用回形针上传图像时,我使用以下模型处理它:

class Picture < ActiveRecord::Base
  has_attached_file :pic, :styles => { :small => "100x100>" }, :whiny => true
  after_save :save_geometry

  def save_geometry
    unless @geometry_saved
      self.original_geometry = get_geometry(:original)
      self.small_geometry = get_geometry(:small)
      @geometry_saved = true
      self.save
    end
  end

  def get_geometry(style = :original)
    begin
      Paperclip::Geometry.from_file(pic.path(style)).to_s
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

get_geometry函数调用ImageMagick identify来查找原始图像和调整大小的图像的几何图形.

我将结果缓存在数据库字段中.例如,如果我上传的图像是1024x768我的缓存字段将包含:

original_geometry = "1024x768"
small_geometry = "100x75"
Run Code Online (Sandbox Code Playgroud)


jor*_*inl 0

您需要需要“RMagick”

uploaded_image = Magick::Image.read(image).first  #image is what you've specified in paperclip to be your image
width = uploaded_image.columns
height = uploaded_image.rows
Run Code Online (Sandbox Code Playgroud)

但不确定如何让它与回调一起工作。也许是这样的:

attr_accessor :write_image_dimensions?
before_save :check_image_changed

def check_image_changed
  self.write_image_dimensions? = image_changed?
end

after_save :write_image_dimensions, :if => :write_image_dimensions?

def write_image_dimensions
  uploaded_image = Magick::Image.read(image).first  #image is what you've specified in paperclip to be your image
  self.width = uploaded_image.columns
  self.height = uploaded_image.rows
  save
end
Run Code Online (Sandbox Code Playgroud)