使用fastimage获取使用carrierwave上传的图像的实际尺寸

时间:2017-10-02 11:25:37

标签: ruby-on-rails ruby carrierwave minimagick

我正在尝试使用carrierwave获取图像的尺寸,但我希望使用我创建的自己的代码获取尺寸,尝试运行fastimage after_saveafter commit。我收到这个错误:

wrong number of arguments (1 for 0)
  Extracted source (around line #45): 
  # [String] contents of the file
  #
  def read
    file.read if file.respond_to?(:read)
  end

carrierwave (0.11.2) lib/carrierwave/uploader/proxy.rb:45:in `read'
fastimage (2.1.0) lib/fastimage.rb:343:in `block in fetch_using_read'

模型看起来像这样

class Micropost < ApplicationRecord

  after_save :change_picture_dimensions
  mount_uploader :picture, PictureUploader

 def change_picture_dimensions
  if :picture?
    widthheight = FastImage.size(picture)
    if widthheight[0] >= 501
      newheightratio =  widthheight[1].to_f / widthheight[0].to_f
  newheight = newheightratio * 500
      self.picture = "<img src=\"" + picture.to_s + "\" width=\"500\" height=\"" +  newheight.to_s + "\">"
      else
      self.picture = "<img src=\"" + picture.to_s + "\" width=\"" + widthheight[0].to_s + "\" height=\"" + widthheight[1].to_s + "\">"
      end
    end
  end

这只是我系统上的本地文件。我可以使用minimagick here来获取尺寸,但想了解更多关于载波的过程以及为什么我不能使用我的方法来获得此错误的尺寸原因?在我的方法中,我只是使用比率来保持纵横比,但是适合我对任何图像的div的固定宽度。

编辑:我意识到我需要在保存对象之前执行此操作,但即使使用before_create,我也会遇到相同的错误。

1 个答案:

答案 0 :(得分:1)

您无法为图片分配字符串。它必须是URL,文件或IO对象。

如果您想要预处理图像宽度以适合500px,请声明以下内容:

<foreignObject width="150" height="150" class="red-y-axis-labels-522">
    <svg>
        <text x="63" y="133" text-anchor="end" stroke="none" fill="#000000" 
    style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px"
    transform="matrix(1,0,0,1,0,0)"  height="2">
            <tspan dy="4.390625" x="63" >0</tspan>
        </text>
        <text x="63" y="103.5" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
            <tspan dy="4.390625" x="63">3.25M</tspan>
        </text>
        <text x="63" y="74" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
            <tspan dy="4.390625" x="63">6.5M</tspan>
        </text>
        <text x="63" y="29.749999999999986" text-anchor="end" stroke="none" fill="#000000" style="text-anchor: end; font-family: Verdana; font-size: 11px;" font-family="Verdana" font-size="11px" transform="matrix(1,0,0,1,0,0)">
            <tspan dy="4.390624999999986" x="63">11.375M</tspan>
        </text>
    </svg>
</foreignObject>

要从其他服务器保存图像,您可以执行以下操作:

# app/uploaders/picture_uploader.rb
class PictureUploader < CarrierWave::Uploader::Base
   ...
   process resize_to_fit: [500, nil]
end

class Micropost < ApplicationRecord
  mount_uploader :picture, PictureUploader
end

现在你可以在页面上呈现它了

micropost = Micropost.create(
  picture: 'http://server.example.org/image.png'
)

您还可以在模型中存储图像大小。阅读this documentation如何执行此操作。将图像尺寸保存到图片模型后,您可以在= image_tag micropost.picture.url 中指定它们,但我认为这将是多余的,因为浏览器会自动检测图像尺寸

image_tag