Ruby on rails 未定义的方法裁剪!在轨道上使用带MiniMagick的Carrierwave 3.1.3

Ruby on rails 未定义的方法裁剪!在轨道上使用带MiniMagick的Carrierwave 3.1.3,ruby-on-rails,carrierwave,minimagick,Ruby On Rails,Carrierwave,Minimagick,我花了很长时间才让它发挥作用,现在仍然是。我会抓住它的核心。我遵循Ryan Bates教程,使用Jcrop和Carrierwave进行裁剪。我选择使用MiniMagick,因为即使在我的机器上重新安装ImageMagick和RMagick,我也会遇到一个错误,导致本地机器上的rails服务器停止工作。不管怎样,改用MiniMagick帮我解决了这个问题。 所以到目前为止一切都很好。我有不同大小的图片正在制作中,他们正在成功上传。 但一旦我尝试裁剪,就会出现以下错误: undefined meth

我花了很长时间才让它发挥作用,现在仍然是。我会抓住它的核心。我遵循Ryan Bates教程,使用Jcrop和Carrierwave进行裁剪。我选择使用MiniMagick,因为即使在我的机器上重新安装ImageMagick和RMagick,我也会遇到一个错误,导致本地机器上的rails服务器停止工作。不管怎样,改用MiniMagick帮我解决了这个问题。 所以到目前为止一切都很好。我有不同大小的图片正在制作中,他们正在成功上传。 但一旦我尝试裁剪,就会出现以下错误:

undefined method `crop!' for #<MiniMagick::CommandBuilder:0x000001052e4608>
不管怎样,正是这种裁剪方法失败了。所以我想,这是一个ImageMagick命令。。。所以我查看了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
只要根据你的情况修改我的方法

关键是以何种格式将变量传递给crop方法,希望这对您有所帮助。

我能够通过向crop命令添加X和Y参数来实现这一点,如@mikhail nikalyukin所示

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

    img = yield(img) if block_given?
    img
  end
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
相反,MiniMagick会动态生成与中指定的许多带破折号前缀的选项相匹配的方法。这些方法中的每一个都将其参数直接传递给
mogrify
,并且都不返回图像对象:

minimagick_image.crop('100x200') # Translates to `mogrify -crop 100x200 image.ext`
minimagick_image.polaroid('12')  # Executes `mogrify -polaroid 12 image.ext`
在实物上,RMagick有
作物和MiniMagick没有

根据ImageMagick文档,
mogrify-crop
采用参数
geometry
。将解释
几何图形
参数。您会注意到所有这些参数都是字符串,因此您将使用
crop('100x200')
crop('100%)
而不是
crop(100200)
。它不像红宝石,但这也是Minimagik如此轻量级的原因之一

有了这些知识,我们可以推断出如何使用Minimagik进行裁剪
mogrify-crop
可以将几何体作为字符串
宽度
x
高度
+
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}"
#将加号与加号连在一起是非常令人困惑的。
#只有当你想让你未来的自我疯狂时才推荐。
mogrify_arg=w++'x'+h++'+x++'+y
#可读但效率低
mogrify_arg=[w,'x',h,'+',x,'+',y]。连接(''')
#可读性有问题
mogrify_arg=“#{w}x#{h}+#{x}+#{y}”

#圆滑、性能好,但有潜在风险:`这看起来真的很有希望,我刚刚尝试更新我的裁剪方法,以包含这个image=minimagik::image.open(model.pdf_url),但它向我吐出了一个错误。对我应该使用的密钥有什么建议吗?我得到的错误是没有这样的文件或目录-/uploads/tmp/20111207-1235-34409-8280/backsideartúu stevie.jpgwell,我想这是一个带有minimagick的问题[.我以前有过它,但当我像上面那样重写裁剪方法时,它就消失了。你仍然会遇到它,这很奇怪。只是补充一下……这是我从Mikhail的代码中所做的。很明显,重要的事情(正如他正确指出的)是(1)将
crop!
替换为
crop
,并在
Operate!
块的末尾返回图像,否则会出现写入错误。
ruby def crop if model.crop\u x.present?将大小调整到\u限制(600600)操纵!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
更新!我非常沮丧,在一台新机器上重新尝试了一切。这次我回到了Rmagick,它起了作用。关键似乎是我的设置。我不确定具体是什么,但它与Ghostscript和/或MacPorts有关。删除MacPorts,重新安装我magemagick,重新安装rmagick,重新安装GhostScript终于为我做到了!谢谢!@faraz精彩地解释了我期待发生的事情,因为我正在考虑一个rmagick示例作为MiniMagick示例。我唯一的问题是大小和偏移量,它生成的字符串无法转换为整数错误from导轨。
# 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