2011-12-07 8 views
16

Me estaba costando trabajo hacer esto, y aún lo estoy haciendo. Llegaré al corazón de eso. Estoy siguiendo el tutorial de Ryan Bates para hacer que el cultivo funcione usando Jcrop y Carrierwave. Opté por utilizar MiniMagick porque, incluso después de reinstalar ImageMagick y RMagick en mi máquina, recibo un error que mata el servidor de los rieles en mi máquina local. De todos modos, cambiar a MiniMagick lo solucionó por mí. Así que todo está muy bien hasta este momento. Tengo imágenes de diferentes tamaños que se están produciendo y se cargan con éxito. Pero una vez que trato de recortar consigo este error:Método indefinido de recorte! Uso de Carrierwave con MiniMagick on rails 3.1.3

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

Esto es confuso a los diablos de mí porque yo estoy usando más o menos el mismo código como Bates:

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 

De todos modos, es ese método de cultivo el que está fallando. Así que pensé para mí mismo, ese es un comando de ImageMagick ... Así que miré el ImageMagick doco, y no pude encontrar el método de recorte con el bang, así que lo intenté sin, y luego el error se convierte en esto:

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

De todos modos, algo no tiene mucho sentido para mí, ¡cualquier ayuda sería apreciada! ¡Gracias por leer!

+0

una actualización! Me sentí muy frustrado e intenté todo de nuevo en una máquina nueva. Volví a Rmagick y funcionó esta vez. La clave parece ser con mi configuración. No estoy seguro de qué, pero tiene algo que ver con Ghostscript y/o MacPorts. Eliminar macports, reinstalar imagemagick, reinstalar rmagick, reinstalar ghostcript finalmente lo hizo por mí. Gracias! – counterbeing

+0

Eso es realmente extraño: | –

Respuesta

14

tenían los mismos problemas, mi solución era este método

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 

basta con modificar mi método para su caso.
La clave está en qué formato pasar variables al método de recorte, espero que esto lo ayude.

+0

Parece muy prometedor, acabo de intentar actualizar mi método de recorte para incluir esta imagen = MiniMagick :: Image.open (model.pdf_url) Pero me está escupiendo un error. ¿Alguna sugerencia sobre la clave que debería usar? El error que recibo es No such archivo o directorio - /uploads/tmp/20111207-1235-34409-8280/backsideart_stevie.jpg – counterbeing

+0

bueno, supongo que es un problema con minimagick [https://github.com/probablycorey/mini_magick/ cuestiones/54]. Lo tengo antes, pero es desalentador cuando reescribo el método de cultivo como el anterior. Es extraño que aún lo encuentres. –

+3

Solo para agregar ... Esto es lo que hice con el código de Mikhail. Lo importante (como lo ha señalado correctamente) es (1) reemplazar 'crop!' Con 'crop' y también devolver la imagen al final del bloque' manipular! 'De lo contrario obtendrás errores de escritura''. 'ruby def crop si model.crop_x.present? resize_to_limit (600, 600) manipular! hacer | 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 final final final' '' –

2

que era capaz de conseguir que esto funcione mediante la adición de los parámetros X e Y a la orden del cultivo como se indica por @ Mikhail-nikalyukin

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

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

En resumen:

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

Aquí hay una mejor explicación de por qué sucedió en lugar de una solución de estilo de cortar/pegar.

RMagick y MiniMagick no son intercambiables. RMagick tiene una muy DSL Rubí-similar y, como tal, emplea métodos que toman múltiples argumentos:

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 vez genera dinámicamente métodos de iterating through a list of MOGRIFY_COMMANDS que coinciden con numerosas opciones de trazos y el prefijo especificados en ImageMagick's mogrify documentation. Cada uno de esos métodos pasar sus argumentos directamente a mogrify y ninguno devolver un objeto de imagen:

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

En especie, RMagick tiene crop! y MiniMagick no.

De acuerdo con los documentos de ImageMagick, mogrify -crop toma un argumento geometry. El argumento geometry se explica here. Notará que todos de esos argumentos son cadenas, entonces en vez de crop(100,200) usaría crop('100x200') o crop('100%). No es muy similar a Ruby, pero eso es parte de lo que hace que MiniMagick sea tan liviano.

Con ese conocimiento, podemos deducir cómo recortar con MiniMagick. mogrify -crop puede tener una geometría en forma de cadena widthxheight+xoffset+yoffset, por lo que sólo hay que construir una cadena similar.

Dado w, h, x y y podría utilizar cualquiera de las siguientes opciones que le resulte más legible:

# 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}" 

Aquí está un ejemplo completo:

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

Gracias! Había estado buscando toda la mañana para una buena explicación de esto. – MBHNYC

+0

Explicación realmente clara. no solo una respuesta. –

+0

@faraz explicación maravillosa de algo que esperaba que sucediera cuando estaba viendo un ejemplo de rMagick bajo consideración para un ejemplo de MiniMagick. Solo lo que tuve fue con el tamaño y el desplazamiento que generó no puede convertir Cadena en errores de Entero de Rieles. – Jerome

Cuestiones relacionadas