Rails:Paperclip、S3、RMagickによる画像のトリミング
-
05-07-2019 - |
質問
現在、ユーザーがトリミング領域を選択し、それに応じて画像をトリミングできるインターネット上の他のシステムと同様のカスタム画像トリミングシステムをコーディングしようとしています。アプリケーションは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リストに載せています。
所属していません StackOverflow