Mostrando entradas con la etiqueta image_science. Mostrar todas las entradas
Mostrando entradas con la etiqueta image_science. Mostrar todas las entradas

miércoles, 6 de agosto de 2008

Escalado proporcional de imágenes con attachment_fu

Por defecto attachment_fu (y su predecesor acts_as_attachment), no escalan las imagenes proporcionalmente al pasarles el parámetro :resize_to, sino que simplemente cambian el ancho y alto a los valores del parámetro.

En attachment_fu, para que escale es tan simple como usar un 'geometry string'. En este test se pueden ver varios ejemplos de escalado

http://github.com/technoweenie/attachment_fu/tree/master/test/geometry_test.rb

así que si queremos tener un tamaño máximo de 200 x 200 pondremos

has_attachment :resize_to => "200x200>"


En el caso de acts_as_attachment, no tenemos esa posibilidad, pero el cambio para que escale es muy simple. En el fichero

vendor/plugins/acts_as_attachment/lib/technoweenie/acts_as_attachment/instance_methods.rb

Dentro del método attachment_data cambiamos

thumbnail_for_image(img, attachment_options[:resize_to])

por

size = attachment_options[:resize_to]
if size.is_a?(Array)
size_ratio = size[0].to_f / size[1].to_f
ratio = img.columns.to_f / img.rows.to_f rescue 0
large_width = (ratio > size_ratio or ratio == 0) ? size[0] : size[1]*ratio
large_height = (ratio < size_ratio or ratio == 0) ? size[1] : size[0]/ratio
size = [large_width, large_height]
end
thumbnail_for_image(img, size)

Y ya escala proporcionalmente. Este trozo de código podría ser más elegante, tal y como esta hecho en

http://github.com/technoweenie/attachment_fu/tree/master/lib/geometry.rb

Pero bueno, ese código lo tengo hecho hace tiempo y funciona :-)

domingo, 15 de junio de 2008

ImageScience y FreeImage en x86_64

Hace un tiempo tuve que hacer un pequeño tratamiento de imagenes, consistente en reescalar las imagenes subidas por los usuarios al servidor. Despues de leer sobre las alternativas disponibles, que son básicamente las que aparecen aquí (RMagick, Mini-magic y ImageScience), me decidí por ImageScience.

Un pre-requisito es instalar FreeImage, pero al instalar la versión 3.10 en Slicehost (Dual-Core AMD Opteron de 64 bits)

uname -a
Linux pre.beruby.com 2.6.18-xen #1 SMP Tue Feb 12 06:40:50 UTC 2008 x86_64 GNU/Linux

da un error de compilación

Source/FreeImage/PluginBMP.cpp: In function 'BOOL LoadPixelDataRLE4(FreeImageIO*, void*, int, int, FIBITMAP*)':
Source/FreeImage/PluginBMP.cpp:227: error: no matching function for call to 'MIN(int&, long int)'
Source/FreeImage/PluginBMP.cpp:282: error: no matching function for call to 'MIN(int&, long int)'
make[1]: *** [Source/FreeImage/PluginBMP.o] Error 1


Como siempre, googleando un poco encontré un parche con la solución que consiste simplemente en cambiar la definición de un par de variables desde DWORD y int a long.

Parece que en la última versión de CVS de FreeImage ya esta solucionado el error, pero bueno, esta solución tambien es valida :-)