未定義の方法作物! Rails 3.1.3でMinimagickを使用してCarrierWaveを使用します

StackOverflow https://stackoverflow.com/questions/8418973

質問

私はこれを機能させるのに時間を費やしていました、そして今でもそうです。私はそれの中心に到達します。 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top