未定義の方法作物! Rails 3.1.3でMinimagickを使用してCarrierWaveを使用します
-
29-10-2019 - |
質問
私はこれを機能させるのに時間を費やしていました、そして今でもそうです。私はそれの中心に到達します。 Ryan Batesのチュートリアルをフォローして、JCROPとCarrierWaveを使用して作物を作業させています。 ImageMagickとRmagickをマシンに再インストールした後でも、ローカルマシンでRailsサーバーを殺すエラーが発生したため、Minimagickを使用することを選択しました。とにかくミニミックに切り替えて、私にとってそれを修正しました。したがって、この時点まですべてが本当に素晴らしいです。さまざまなサイズの画像が作成されており、それらは正常にアップロードされています。しかし、私が収穫しようとすると、私はこのエラーが得られます:
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 Docoを見ました、そして私は強打で作物の方法を見つけることができなかったので、私はそれなしでそれを試しました、そして、エラーはこれに変わります:
No such file or directory - /var/folders/dF/dFNM2+Y7FVScn4+OxVHKOU+++TI/-Tmp-/mini_magick20111207-34409-1tnaa07.jpg
とにかく、何かが私にはあまり意味がありません、どんな助けも感謝します!読んでくれてありがとう!
解決
同じ問題がありました、私の解決策はこの方法でした
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
ケースの方法を変更するだけです。
重要なのは、フォーマットが変数を収穫方法に渡すことです。これがあなたに役立つことを願っています。
他のヒント
要するに:
img.crop("#{size}#{offset}") # Doesn't return an image...
img # ...so you'll need to call it yourself
これがより良い説明です どうして これは、カット/ペーストスタイルのソリューションとは対照的に起こりました。
RmagickとMinimagickは交換可能ではありません。 Rmagickには非常にRubyのような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
代わりに、ミニミックはメソッドを動的に生成します のリストを繰り返します MOGRIFY_COMMANDS
これは、で指定された多数のDash-Prefixedオプションと一致します ImageMagick's mogrify
ドキュメンテーション. 。これらの各メソッドは、議論を直接渡します mogrify
イメージオブジェクトを返すものはありません。
minimagick_image.crop('100x200') # Translates to `mogrify -crop 100x200 image.ext`
minimagick_image.polaroid('12') # Executes `mogrify -polaroid 12 image.ext`
種類では、rmagickは持っています crop!
そして、ミニミックはそうではありません。
ImageMagick Docsによると、 mogrify -crop
議論をします geometry
. 。 geometry
議論が説明されています ここ. 。あなたはそれに気付くでしょう 全て それらの議論のうち、文字列があるので、その代わりに crop(100,200)
使用します crop('100x200')
また crop('100%)
. 。それはあまりルビーのようではありませんが、それはミニミックをとても軽量にしている理由の一部です。
その知識があれば、私たちはミニミックで収穫する方法を推測することができます。 mogrify -crop
ジオメトリを文字列として取ることができます width
バツheight
+xoffset
+yoffset
, 、そのため、同様の文字列を構築する必要があります。
与えられた w
,h
,x
, 、 と y
最も読みやすいと思われる次のいずれかを使用できます。
# 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}"
これが完全な例です:
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
@mikhail-nikalyukinで示されているように、作物コマンドにxパラメーターとyパラメーターを追加することで、これを機能させることができました
def crop
manipulate! do |img|
img.crop "750x600+0+0"
img.strip
img = yield(img) if block_given?
img
end
end