簡體   English   中英

Rails:使用 Paperclip、S3 和 RMagick 進行圖像裁剪

[英]Rails: Image cropping with Paperclip, S3 and RMagick

我目前正在嘗試編寫一個類似於互聯網上其他系統的自定義圖像裁剪系統,用戶可以 select 裁剪區域,然后相應地裁剪他們的圖像。 該應用程序位於 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,因此沒有正確裁剪。 以前有人用回形針嘗試過這樣的事情嗎? 這甚至不可能,但任何幫助將不勝感激。

我暫時能夠解決這個問題如下:

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

您可以在 model 上定義一些 attr_accessors 並在創建實際文件之前在 controller 操作中設置它們。 下面應該工作..

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

您可能想仔細看看Paperclip 處理器

實際上,我自己的代碼中也有同樣的問題,並且在我的待辦事項列表中有這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM