質問

現在、ユーザーがトリミング領域を選択し、それに応じて画像をトリミングできるインターネット上の他のシステムと同様のカスタム画像トリミングシステムをコーディングしようとしています。アプリケーションは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はペーパークリップライブラリの一部です。

他のヒント

実際のファイルを作成する前に、モデルで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

Paperclipプロセッサを詳しく見ることができます。 。

私は実際に自分のコードで同じ問題を抱えており、それをtodoリストに載せています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top