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 :-)