Rails:使用Paperclip,S3和RMagick进行图像裁剪

3

我目前正在尝试编写一个自定义的图像剪裁系统,类似于互联网上的其他系统,用户可以选择剪裁区域,然后相应地剪裁他们的图像。该应用程序使用Rails和将文件存储在Amazon S3中的Paperclip。然而,我在从S3获取文件并使用RMagick适当地裁剪文件方面遇到了很多麻烦。以下是当前的代码(它不起作用):

   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

主要问题是裁剪后的图像没有通过paperclip上传回S3,因此不能正确地裁剪。之前有人尝试过使用paperclip实现这样的功能吗?这可能甚至不可能,但任何帮助都将不胜感激。

你具体在哪里遇到了问题? - Chris Lloyd
我在通过 paperclip 将裁剪后的图片上传回 S3 时遇到了问题。 - Eric Scrivner
3个回答

5

目前我已经能够通过以下方式解决这个问题:

  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是paperclip库的一部分。


0
你可以在模型上定义一些 attr_accessors,并在控制器操作中设置它们,然后再创建实际文件。以下代码应该有效...
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),只考虑了宽度和高度。 - Eric Scrivner

0

你可能想要更仔细地查看Paperclip处理器

实际上,我在自己的代码中也遇到了同样的问题,并将其列入待办事项。


Paperclip处理器对此并不真正灵活,因为我需要在params哈希中传递参数以正确裁剪,而在paperclip中没有真正的方法将参数传递给处理器。 - Eric Scrivner
您可以将这些参数设置为模型的属性,并通过在#make方法中调用attachment.instance来访问它们。 - Daniel Schierbeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接