jueves, 17 de noviembre de 2011

Redimensionar manteniendo proporción

Este tema es básico en extremo pero he decidido publicarlo porque he notado que siguen existiendo errores al realizar esta operación de redimensión.

Es común ver bastantes fórmulas para redimensionar imágenes (por ejemplo cuando se quiere crear una imagen miniatura/thumbnail), o cualquier otro plano 2d, pero muchas de ellas no calculan la redimensión para mantener la proporción. He visto que los autores de otras fórmulas que sí mantienen la proporción son un tanto complejas y no muy claras (con código innecesario) e incluso llegan a fallar o recortar la imagen/plano resultando en algo no deseado. Así que les dejo la fórmula en Lua (pero fácilmente puede ser traducida a otros lenguajes como php, etc) para obtener los el nuevo tamaño de imagen/plano manteniendo el aspecto:

function resize(w,h,t_w,t_h)
    local divisor_proporcion = (w>h) and w/t_w or h/t_h;
    local new_width = math.ceil(w/divisor_proporcion);
    local new_height = math.ceil(h/divisor_proporcion);
    return new_width, new_height;
end
local thumb_width = 100;
local thumb_height = 100;
local image_width = 350;
local image_height = 491;
local new_w,new_h = resize(image_width, image_height, thumb_width, thumb_height);
print(new_w,new_h);--imprimirá 72,100

Como podrán ver la fórmula es simple porque primero debemos determinar cual de las 2 dimensiones (altura ó ancho) del plano es la mayor y de ahi crear un divisor de proporción.

Posteriormente dicho divisor de proporción es utilizado para obtener el nuevo alto y ancho del plano, apoyándonos de un redondeo al entero próximo mayor del resultado.

Con ésta fórmula no tendrán inconveniente alguno que incluso funcionará con dimensiones menores a las del thumbnail/miniatura creciendo el plano. Pero si quieren evitar que en dicho caso se agrande el plano entonces sólo deben editar la formula/código anterior quedando de la siguiente forma:

function resize(w,h,t_w,t_h)
    if w > t_w or h > t_h then
        local divisor_proporcion = (w>h) and w/t_w or h/t_h;
        local new_width = math.ceil(w/divisor_proporcion);
        local new_height = math.ceil(h/divisor_proporcion);
        return new_width, new_height;
    else
        return w,h;
    end
end

1 comentario:

  1. If you're looking to lose pounds then you certainly have to start using this totally brand new custom keto meal plan diet.

    To produce this service, licensed nutritionists, fitness couches, and cooks have united to develop keto meal plans that are efficient, decent, money-efficient, and delicious.

    From their grand opening in 2019, 100's of people have already completely transformed their body and health with the benefits a great keto meal plan diet can give.

    Speaking of benefits: clicking this link, you'll discover eight scientifically-confirmed ones given by the keto meal plan diet.

    ResponderEliminar