Publicidad:
Terra
La Coctelera

Mis Tags > rmagick

Hay 3 artículos con el tag rmagick.

Otros artículos en La Coctelera
clasificados con rmagick

Hoy hemos hecho un import masivo de imágenes a una web, y han quedado así, tan bonitas con todos sus tamaños bien buestos gracias a attachment_fu (vía RMagick).

Cuando he ido a la web a comprobar qué tal quedaba todo me he dado cuenta de que los thumbnails generados descargaban lentitos, así que por pura casualidad me dió por mirar el tamaño de cada imagencita de 50x50 pixeletes de nada.

Mmmm.... 60kb!!!! WTF!!!!

Vale, tranquilidad... es un error... voy a mirar mi importación en local que seguro que está mejor.

Pues mira no, está igual :)

La primera solución, y la más obvia, es la de tocar la calidad de la imagen en la importación en rmagick, de hecho <a href="http://sobrerailes.com/">Lupión</a> me envió este post donde incluso te hablan de tocar la imagen de forma selectiva en función del thumbnail.

Así que nada... toco mi métodito en attachment_fu y le casco una calidad de 70 y... ya está!!

Reimportamos mientras me tomo un cafetito y... ale, ha terminado. Esto no puede haber salido mal, pero por si las moscas voy a ver qué ocupa la misma image de 50x50.

Aha... 45kb... mecagoen!!!!!

Antes de sacar el hacha vamos a ver qué puede tener esa imagen. Command + i y...

Aha... así que este thumbnail se ha hecho con una nikon :)

El caso es que RMagick al manipular una imagen no nos elimina ni los posibles comentarios y notas que pueda tener la imagen, ni ninguno de sus perfiles, ni exif... vamos, que se viene con todos los metadatos puestos. En una imagen mediana o grande tal vez esos Kbs de más no molesten, pero en cositas tan pequeñas yo prefiero eficiencia a sobreinformación.

Podemos ser mucho más selectivos, pero por lo general el comando strip! es nuestro amigo :) De este modo en vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb, en el método resize_image, retocamos esta linea:

 self.temp_path = write_to_temp_file(img.to_blob)
 

Por esto:

 img.strip!
 self.temp_path = write_to_temp_file(img.to_blob {self.quality = 70})
 

Lo de la calidad es opcional, RMagick usa por defecto el 75% de calidad, que es válida para un montón de casos.

Así que volvemos a lanzar la importación... 3... 2... 1... y a ver. Esta vez no nos esperamos a que acabe :) Et voilà! Su imagen de 4Kb!

Cosa fina!

Enfrentarte a rMagick y salir victorioso es genial, da un 'gustito' que no es normal.

En la parte de common tasks de la docu de rmagick nos indica que, para hacer una imagen en escala de grises debemos de usar el comando quantize más o menos así:

 imagen= img.quantize(256, Magick::GRAYColorspace)
 

Esto funciona, peeeeero si te fijas queda bastante guarrete. Esto es porque restringimos la escala a 256 colorejos de nada. No está mal, pero se nota que la calidad desciende en picado. Además en cuanto subes de 256 niveles para arriba rmagick devora memoria sin ninguna vergüenza.

La mejor alternativa (a no ser que alguien me diga lo contrario, que equivocados podemos estar todos) es cambiar el tipo de la imagen (no es exactamente cambiar el perfil). ¿Cómo? Pues fácil, fácil:

 imagen.image_type = GrayscaleType
 

Las diferencias en la calidad de la imagen generada son patentes, y el consumo de memoria bastante inferior al del quantize.

Amigos sufridores del rmagick en producción. Que descanso de cuerpo se le queda a uno cuando activa el garbage collector.

Cuando usas una aplicación que hace verdaderas perradas con las imágenes hay veces que a rmagick no se le puede pedir un rendimiento excesivamente fino, y es de esperar que en algún momento oigas crujir el código y ver como rails se tumba (en el mejor de los casos). Si además prevees que tu aplicación la use alguien más que tú pues empieza a multiplicar riesgos.

Hace dos días tiré la aplicación que tengo en preproducción con apenas 3 usuarios concurrentes, así que tirando un poquito del hilo ha salido el fantabuloso garbage collector al rescate, apostillado por esta página de la wiki de rails.

Reproduzco la jugada!

   def run_gc
     fDisabled = GC.enable
     GC.start
     GC.disable if fDisabled
   end
 

Unas lineas de na, que pueden evitar que pases tu fin de semana pegado al ssh mirando al top y comiendo palomitas para no perderte las mejores leches de tu servidor rails.