ruby-on-rails - Rails : Image cropping with Paperclip, S3 和 RMagick

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

我目前正在尝试编写一个类似于 Internet 上其他系统的自定义图像裁剪系统,用户可以在其中选择裁剪区域,然后相应地裁剪他们的图像。该应用程序在 Rails 中,我们使用 Paperclip 和 Amazon S3 来存储文件。虽然让 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,因此裁剪不正确。 以前有人用回形针尝试过这样的事情吗?这甚至可能是不可能的,但我们将不胜感激任何帮助。

最佳答案

我暂时能够解决这个问题如下:

  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 是回形针库的一部分。

关于ruby-on-rails - Rails : Image cropping with Paperclip, S3 和 RMagick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/620809/

相关文章:

c - 如何在 Ruby 和 c 之间共享数据?

ruby - 在自定义 Airbrake 通知中传递环境

javascript - 还有其他人在设计 Twitter Typeahead 的搜索栏时遇到问题吗?

java - 使用安全/https URL 的 S3 预签名 URL 文件上传失败

php - 通过 php sdk 过期对象 s3

css - 不良 Assets Heroku 链接

html - Sprockets::FileNotFound...找不到 css 文件

ruby-on-rails - Wicked gem Rails - 如何创建一个新对象

ruby-on-rails - 如何在 Ruby 中仅在等于 "."之前分割点 "="

python - 使用 python boto3 生成带有 v4 签名的 S3 预签名 URL