Subo esta pequeña función por dos motivos. Una por que ya la he pegado un par de veces en el canal para la gente que no le apetece pensar mucho la sencilla regla de tres que se aplica en el script. Y otra inspirado por el script de nils de redimensionado de imágenes, espero que le pueda ayudar a solventar sus problemas con el redimensionado, o al menos aportar ideas.
En dicho script, a la hora de dimensionar se dan las coordenadas que tendrá al final el gráfico (800x600 por ejemplo).
Sin embargo un gráfico puede tener cualquier tipo de relación ancho alto, que no necesariamente coincidirá con la relación 800x600 (será más cuadrada, más alargada, más achatada).
En lugar de intentar forzar la imagen a que ocupe el tamaño indicado, lo que este script hace es, dado un hueco máximo, calcular el tamaño horizontal y vertical de la imagen de forma que ocupe el tamaño máximo de ese hueco sin perder su proporcionalidad.
Pensemos en las películas en cinemascope: la imagen tiene diferente ratio que nuestro televisor (es mucho más ancha que alta). Para hacerla "encajar" sin deformar las imágenes no queda otro remedio que añadir las famosas bandas negras arriba y abajo. Igualmente, las imágenes normales que vemos en televisión aparecen con dos bandas negras verticales si las vemos en un televisor panorámico (ok, hay otros métodos como interpolación usados en los televisores panorámicos para "estirar" la imagen sin deformarla, pero no viene al caso).
¿Cómo funciona el algoritmo de este script? Es muy sencillo: Se trata de ajustar una de las medidas a uno de los tamaños indicados, y calcular la otra de forma que sea proporcional.
Dado un hueco de 100x100 pixeles y una foto de 800x600 (por ejemplo) decidimos cual es la relacion hueco/tamaño menor (100/800) < (100/600), y la hacemos igual a 100 (en este caso 100 sería el ancho (800)) para asegurarnos un relleno óptimo del hueco (al menos una de las medidas será siempre la máxima). Este calculo nos indica cómo es la foto (si mas ancha que alta y viceversa con respecto al hueco asignado). La otra se calcula de forma que sea proporcional 600*(100/800). Así que la imagen resultante será de 100x75 pixeles ocupando el hueco dado de la forma más eficaz sin perder su ratio original.
Imaginaos que teneis en vuestra web un hueco de 100x200 pixeles para poner fotos de usuarios. Mediante esta pequeña función vuestros usuarios podrán subir fotos de cualquier resolución sin miedo a deformar vuestro diseño ni distorsionar la proporción de la imagen.
El argumento $extender de la funcion es una idea muy simple: Si le damos un hueco máximo de 200x300 pixeles y la foto mide 70x100 pixeles pueden ocurrir 2 cosas: que la dejemos tal como está (70x100 : $extender=false) o que la "extendamos" para que ocupe lo máximo posible dentro de su hueco. Procedemos como antes: cogemos la coordenada con menor proporcion (200/70)<(300/100) el ancho (70) y lo hacemos igual al ancho hueco especificado (200). La otra coordenada se calcula proporcionalmente: 100*(200/70) con lo que la imagen resultante tendra un tamaño de 200x286 pixeles.
Si no habéis entendido el concepto de la función, simplemente meted el script en un directorio lleno de imágenes y ejecutadlo, viendo el resultado la idea es muy intuitiva.
<?php
function normalizar_grafico($size_x,$size_y,$hueco_x,$hueco_y,$extender = true) {
if ($size_x > 0 && $size_y > 0) {
if ($size_x <= $hueco_x && $size_y <= $hueco_y && !$extender) {
$y = $size_y;
$x = $size_x;
}
else {
if ($hueco_x/$size_x < $hueco_y/$size_y) {
$x = $hueco_x;
$y = $size_y*($hueco_x/$size_x);
}
else {
$x = $size_x*($hueco_y/$size_y);
$y = $hueco_y;
}
}
$coord = array (round($x),round($y));
return $coord;
}
else return false;
}
// Ejemplo de uso:
// Muestra en una pagina una tabla de n x 4 celdas todas las imagenes
// que se encuentren en el directorio donde se ejecuta el script.
// Se ha puesto el borde de la tabla a 1 para que se note
// el efecto de la redimensión, y cómo se ajustan las imágenes
// al ancho/alto del hueco especificado.
echo '<table border="1"><tr>';
$dir = "./";
$extensiones = array('jpg','jpeg','gif','png');
$dp = opendir($dir);
$max_width=100;
$max_height=125;
$i = 0;
while ($file = readdir($dp)) {
if ($file != '.' && $file != '..' && in_array(strtolower(substr(strrchr($file,'.'),1)),$extensiones)) {
// buena idea el strrchr() nils
$i++;
$tamaño=getimagesize($file);
$tamaño=normalizar_grafico($tamaño[0],$tamaño[1],$max_width,$max_height,true);
echo '<td align="center" width="'.$max_width.'" height="'.$max_height.'">
<img src="'.$dir.$file.'" width="'.$tamaño[0].'" height="'.$tamaño[1].'" /></td>';
if ($i%4 == 0) echo '</tr><tr>';
}
}
echo '</tr></table>';
?>
thessoro © 2004 Para cualquier duda, sugerencia o correción: standby@ono.com