Ruby on rails 获取图像尺寸

Ruby on rails 获取图像尺寸,ruby-on-rails,imagemagick,carrierwave,minimagick,Ruby On Rails,Imagemagick,Carrierwave,Minimagick,我使用carrierwave上传图像,我需要获得图像尺寸,并在上传时存储它们 CarrierWave有一个解决方案: class ImageUploader零 2.4.1:002>Post.last.attachments.first.get_几何体 加载后(1.9ms)选择“posts”。*从“posts”中按“posts”排序。“id”DESC LIMIT$1[[“LIMIT”,1]] => [400, 200] Edit2 如果我使用下面的carrierwave建议,将这些val存储

我使用carrierwave上传图像,我需要获得图像尺寸,并在上传时存储它们

CarrierWave有一个解决方案:

class ImageUploader
虽然我可以看到如何在db字段中存储单个图像的高度和宽度,但我使用的是多文件上传器。

上载多个文件时如何存储这些图像尺寸

Edit1

class AttachmentUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  process resize_to_limit: [400, 400]
  process :get_geometry

  def geometry
    @geometry
  end

  def get_geometry
    if (@file)
      @geometry = ::MiniMagick::Image.open(@file.file)[:dimensions]
    end
  end    

end


2.4.1 :001 > Post.last.attachments.first.geometry
  Post Load (2.8ms)  SELECT  "posts".* FROM "posts" ORDER BY "posts"."id" DESC LIMIT $1  [["LIMIT", 1]]
 => nil 
2.4.1 :002 > Post.last.attachments.first.get_geometry
  Post Load (1.9ms)  SELECT  "posts".* FROM "posts" ORDER BY "posts"."id" DESC LIMIT $1  [["LIMIT", 1]]
 => [400, 200] 
类AttachmentUploaderPost.last.attachments.first.geometry Post Load(2.8ms)按“posts”顺序从“posts”中选择“posts”。“id”DESC LIMIT$1[[“LIMIT”,1]] =>零 2.4.1:002>Post.last.attachments.first.get_几何体 加载后(1.9ms)选择“posts”。*从“posts”中按“posts”排序。“id”DESC LIMIT$1[[“LIMIT”,1]] => [400, 200]
Edit2

如果我使用下面的carrierwave建议,将这些val存储在db字段中,则它适用于单个图像。但是,当我上载多个图像时,每个后续图像都会覆盖这些值,因此我可能有三个图像,但存储的高度和宽度只有一个val

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process :store_dimensions

  private

  def store_dimensions
    if file && model
      model.width, model.height = ::MiniMagick::Image.open(file.file)[:dimensions]
    end
  end
end
class ImageUploader
你能根据型号的名称来做这样的事情吗

version :post do
  process :resize_to_fit => [200, nil]
  process :get_geometry

  def geometry
    @geometry
  end
end

def get_geometry
  if (@file)
    img = ::Magick::Image::read(@file.file).first
    @geometry = [ img.columns, img.rows ]
  end
end

然后,您可以在“保存后”回调中读取图像的几何图形,并将其保存在模型中的自定义db行中。

谢谢您的帮助。@geometry存储在何处,以便我可以访问其中的值?无法通过post.geometry访问?抱歉,我目前没有一个运行中的应用程序与carrierwave一起通过MySelf对其进行测试。carrierwave是否为模型提供了“后处理”回调,您可以访问get\u geometry方法并将值保存在db列中。(您必须首先创建db列。例如,一个序列化的属性或宽度和高度作为单独的列)或者在after_save回调->when width,height not set(宽度、高度未设置)中尝试,然后从self.get_geometry(获取几何体)获取信息?
version :post do
  process :resize_to_fit => [200, nil]
  process :get_geometry

  def geometry
    @geometry
  end
end

def get_geometry
  if (@file)
    img = ::Magick::Image::read(@file.file).first
    @geometry = [ img.columns, img.rows ]
  end
end