【问题标题】:Rails: Image cropping with Paperclip, S3 and RMagickRails:使用 Paperclip、S3 和 RMagick 进行图像裁剪
【发布时间】:2010-10-11 20:55:34
【问题描述】:

我目前正在尝试编写与 Internet 上其他系统类似的自定义图像裁剪系统,用户可以在其中选择裁剪区域,然后相应地裁剪图像。该应用程序位于 Rails 中,我们使用带有 Amazon S3 的 Paperclip 来存储文件。尽管让 RMagick 从 S3 适当地裁剪文件,但我遇到了很多麻烦。这是当前代码(不起作用):

   if params[:width].to_i > 0 and params[:height].to_i > 0 then
      photo = Photo.find(params[:id])
      image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
      orig_img = Magick::ImageList.new
      orig_img.from_blob(image_data)

      args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
      orig_img.crop!(*args)
      photo.update_attributes({:photo => orig_img.to_blob})

      photo.photo.reprocess!
      photo.save
    end

主要问题是裁剪后的图像没有通过回形针上传回 S3,因此没有正确裁剪。 以前有人用回形针尝试过这样的事情吗?这甚至不可能,但我们将不胜感激。

【问题讨论】:

  • 你到底是哪里出了问题?
  • 我无法通过回形针将裁剪后的图像上传回 S3。

标签: ruby-on-rails ruby amazon-s3 paperclip


【解决方案1】:

这个问题我暂时可以解决如下:

  photo = Photo.find(params[:id])
  image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
  orig_img = Magick::ImageList.new
  orig_img.from_blob(image_data)

  args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
  orig_img.crop!(*args)

  tmp_img = Tempfile.new("image_data")
  orig_img.format = "png"
  tmp_img.write(orig_img.to_blob)
  photo.photo = tmp_img
  tmp_img.close

  photo.photo.reprocess!
  photo.save

这里主要关注的是创建一个新的临时文件的速度,所以我们可能不得不创建自己的自定义界面。希望这可以成为人们解决类似问题的良好起点。

编辑:请注意,Tempfile 是回形针库的一部分。

【讨论】:

    【解决方案2】:

    您可以在模型上定义一些 attr_accessor 并在创建实际文件之前在控制器操作中设置它们。以下应该可以工作..

    class Poodle < ActiveRecord::Base
      has_attached_file :avatar, :styles => Proc.new{|a| a.instance.get_styles}
      attr_accessor :width, :height
    
    
      def get_styles(style = "medium")
        return {style.to_sym => [self.width, self.height].join("x") + ">" }
      end
     end
    

    【讨论】:

    • 这样做的问题是它没有考虑裁剪开始坐标(x1,y1),只考虑宽度和高度。
    【解决方案3】:

    您可能需要仔细查看Paperclip processors

    实际上我自己的代码中也有同样的问题,并且在我的待办事项列表中也有。

    【讨论】:

    • Paperclip 处理器不会真正以灵活的方式工作,因为我需要在 params 哈希中传递参数才能正确裁剪,并且没有真正的方法将参数传递给回形针中的处理器。
    • 您可以将这些参数设置为模型上的属性,并通过在您的#make 方法中调用attachment.instance 在您的处理器中访问它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2012-01-03
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多