2009-03-06 13 views
3

私は現在、インターネット上の他の画像と同様のカスタム画像クロッピングシステムをコーディングしようとしています。ここでユーザーはクロッピング領域を選択し、アプリケーションはRailsにあり、Amazon S3でPaperclipを使用してファイルを保存しています。 S3からファイルを適切にトリミングするためにRMagickを取得するにもかかわらず、私は多くの問題を抱えています。ここで(動作しない)現在のコードがある:Rails: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 

主な問題は、トリミングされた画像をクリップを介してバックS3にアップロードされていないことであり、したがって、適切にトリミングしません。 誰もこれのような何かの前にペーパークリップでしようとしましたか?これは可能ではないかもしれませんが、どんな助けも大歓迎です。

+0

どこに問題がありますか? –

+0

クロップされた画像をpaperclipを通じてS3にアップロードするのに問題があります。 –

答えて

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はペーパークリップライブラリの一部です。

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 
+0

この問題は、トリミング開始座標(x1、y1)、幅と高さだけを考慮していないことです。 –

0

Paperclip processorsを詳しく見ることができます。

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

+0

ペーパークリッププロセッサは実際には柔軟に動作しません。なぜなら、適切にトリミングするためにパラメータハッシュで渡されるパラメータが必要であり、ペーパークリップのプロセッサにパラメータを渡す実際の方法はないからです。 –

+0

これらのパラメータはモデル上の属性として設定でき、 '#make'メソッドで' attachment.instance'を呼び出すことでプロセッサーにアクセスできます。 –

関連する問題