2011-12-07 6 views
16

私はこれをうまく動作させるには時間がありましたが、まだまだです。私はそれの中心に行くでしょう。 Ryan Batesのチュートリアルに従って、JcropとCarrierwaveを使って作物を作っています。自分のマシンにImageMagickとRMagickを再インストールした後でも、私のローカルマシン上のレールサーバーを強制終了するエラーが発生するため、MiniMagickを使用することを選択しました。とにかくMiniMagickに切り替えると、私のためにそれが修正されました。 この時点まではすべてが本当にうれしいです。私は生産されている異なるサイズの画像を持っており、彼らは正常にアップロードされています。 しかし、私はトリミングしようとしたら、私はこのエラーを取得する:未定義メソッドcrop!レール上でMiniMagickでCarrierwaveを使う3.1.3

undefined method `crop!' for #<MiniMagick::CommandBuilder:0x000001052e4608> 

私はかなりベイツとまったく同じコード使用していますので、これは私のうちの一体を混乱さ:とにかく

def crop 
if model.crop_x.present? 
    resize_to_limit(700, 700) 
    manipulate! do |img| 
    x = model.crop_x.to_i 
    y = model.crop_y.to_i 
    w = model.crop_w.to_i 
    h = model.crop_h.to_i 
    img.crop!(x, y, w, h) 
    end 
end 
end 

を、それは失敗している作物の方法です。だから私はImageMagickコマンドだと思ったのでImageMagickのdocoを見ましたが、私はbangでトリミングメソッドを見つけることができませんでしたので、これを試してみましたが、エラーは次のようになります:

No such file or directory - /var/folders/dF/dFNM2+Y7FVScn4+OxVHKOU+++TI/-Tmp-/mini_magick20111207-34409-1tnaa07.jpg 

とにかく、何かが私には分かりませんが、どんな助けもありがとう! 読んでいただきありがとうございます!

+0

更新:

# Concatenating plus signs with plus signs is atrociously confusing. # Recommended only if you want to drive your future self insane. mogrify_arg = w + 'x' + h + '+' + x + '+' + y # Readable but inefficient mogrify_arg = [ w, 'x', h, '+', x, '+', y ].join('') # Questionable readability mogrify_arg = "#{w}x#{h}+#{x}+#{y}" # Slick, performant, but potentially risky: '<<' modifies the receiving object in place # 'w' is actually changing here to "WxH+X+Y"... mogrify_arg = w << 'x' << h << '+' << x << '+' << y # A lovely, self-documenting version size = w << 'x' << h offset = '+' << x '+' << y mogrify_arg = "#{size}#{offset}" 

はここで完全な例です!私は非常に非常に不満を持って、新しいマシンですべてをやり直しました。私はRmagickに戻り、今回はうまくいった。重要なことはセットアップのようだった。私は具体的に何がわかりませんが、GhostscriptやMacPortsと関係があります。 macportsを削除し、imagemagickを再インストールし、rmagickを再インストールし、ghostcriptを再インストールすると、やっと私のためにやった! ありがとう! – counterbeing

+0

それは本当に変です。 –

答えて

14

は同じ問題を抱えていた、私の解決策は、ちょうどあなたのケースのための私の方法を変更し、この方法

def cropped_image(params) 
    image = MiniMagick::Image.open(self.image.path) 
    crop_params = "#{params[:w]}x#{params[:h]}+#{params[:x]}+#{params[:y]}" 
    image.crop(crop_params) 

    image 
end 

ました。
キーは、どのようなフォーマットをトリミングメソッドに渡しますか、これがあなたを助けてくれることを願っています。

+0

これは本当に有望ですが、私はちょうどこの画像を含むように私の作物メソッドを更新しようとしました= MiniMagick :: Image.open(model.pdf_url)しかし、それは私にエラーを吐き出している。私が使用すべきキーに関する提案はありますか?私が得るエラーはそのようなファイルやディレクトリはありません - /uploads/tmp/20111207-1235-34409-8280/backsideart_stevie.jpg – counterbeing

+0

よく、私はそれがminimagick [https://github.com/probablycorey/mini_magick/の問題だと思います問題/ 54]。私はそれを前に持っていますが、上記のように作法を書き直すと消えてしまいます。あなたがまだそれに遭遇するのは変です。 –

+3

ちょうど追加する...私はミハイルのコードから何をしたのですか?重要なことは明らかです(彼が正しく指摘しているように)。(1) 'crop!'を 'crop 'に置き換え、' manipulate!'ブロックの最後にイメージを返します。そうしないと、書き込みエラーが発生します。 'ruby def crop if model.crop_x.present? resize_to_limit(600,600) 操作してください! do | img | X = model.crop_x.to_i Y = model.crop_y.to_i W = model.crop_w.to_i H = model.crop_h.to_i img.crop( "#{W}、X位{H} +#{X } +#{y}」) img end end end '' ' –

2

私は、これは要するに@ミハイル・nikalyukin

def crop 
    manipulate! do |img| 
    img.crop "750x600+0+0" 
    img.strip 

    img = yield(img) if block_given? 
    img 
    end 
end 
47

によって示されるように、作物のコマンドにXとYのパラメータを追加することによって、仕事を得ることができました:

img.crop("#{size}#{offset}") # Doesn't return an image... 
img # ...so you'll need to call it yourself 

はここで良いでしょうなぜこれはカット/ペーストスタイルのソリューションとは対照的に起こったのですか?

RMagickとMiniMagickは互換性がありません。 RMagickは非常にルビーのようなDSLを持ち、そのように複数の引数を取る方法を採用しています

rmagick_image.crop(x_offset, y_offset, width, height) # Returns an image object 
rmagick_image.crop!(x_offset, y_offset, width, height) # Edits object in place 

MiniMagickではなく、動的にImageMagick's mogrify documentationに指定された数多くのダッシュ接頭辞のオプションと一致iterating through a list of MOGRIFY_COMMANDSによってメソッドを生成します。これらの方法の各々は、mogrifyに直接引数を渡し、いずれも画像オブジェクトを返さない:現物

minimagick_image.crop('100x200') # Translates to `mogrify -crop 100x200 image.ext` 
minimagick_image.polaroid('12') # Executes `mogrify -polaroid 12 image.ext` 

は、RMagickはcrop!を有しMiniMagickはありません。

ImageMagickの文書によると、mogrify -cropは、引数geometryをとります。 geometry引数はhereと説明されています。 これらの引数のうちはすべて文字列なので、crop(100,200)の代わりにcrop('100x200')またはcrop('100%)を使用することに気が付くでしょう。これはRubyのようなものではありませんが、それはMiniMagickをとても軽量にする要因の一部です。

この知識を使って、MiniMagickで作物をする方法を推測することができます。 mogrify -cropは、文字列widthXheight+xoffset+yoffsetとしてジオメトリを取ることができますので、我々はちょうど似た文字列を構築する必要があります。

はあなたが最も読みやすい見つけ、次のいずれかを使用できyxhwが与えられ、そして:

def crop 
    if model.crop_x.present? 
    resize_to_limit(700, 700) 

    manipulate! do |img| 
     x = model.crop_x 
     y = model.crop_y 
     w = model.crop_w 
     h = model.crop_h 

     size = w << 'x' << h 
     offset = '+' << x << '+' << y 

     img.crop("#{size}#{offset}") # Doesn't return an image... 
     img # ...so you'll need to call it yourself 
    end 

    end 
    end 
+1

ありがとう!これについての良い説明のために徹夜をしていた。 – MBHNYC

+0

本当に明確な説明。答えだけではありません。 –

+0

@Faraz私は、MiniMagickの例のために検討中のrMagickの例を見ていたときに、私は何とかなることを期待していました。私が持っていたissuだけが、Stringを整数型のエラーからRailsに変換できないサイズとオフセットを持っていました。 – Jerome

関連する問題