Hace tiempo me encontré en la necesidad de calcular el índice de proporcionalidad de imágenes que eran subidas por los usuarios a través de un formulario web. A continuación explicaré en qué consiste éste índice, qué algoritmo debe aplicarse y cómo realizarlo en php. Pido clemencia en caso de cometer algun error garrafal, no soy matemático
1. Introducción
El índice de proporcionalidad (traducción no literal del inglés “aspect ratio“), es el resultado de la división entre el ancho y el alto de una imagen, y nos indica la relación que hay entre ambas dimensiones.
1.1 Ejemplos:
Las unidades no son relevantes por tanto no se incluyen.
- Imagen 1 (100 ud. de ancho por 100 ud. de alto):
indice = 100 / 100 = 1 - Imagen 2 (200 ud. de ancho por 100 ud. de alto):
indice = 400 / 300 = 1,3333333333 …. - Imagen 3 (1024 ud. de ancho por 576 ud. de alto):
indice = 1024 / 576 = 1,7777777777777 …..
De ésta forma, el ancho de la imagen multiplicado por éste índice nos proporcionará su altura.
Si bien es válido mostrar éste índice como un número decimal, matemáticamente la forma correcta de expresarlo es mediante x:y (ésta forma de notación también se utiliza para escalas cartográficas). Por tanto, en nuestros ejemplos anteriores, el índice podría expresarse como 100:100, 400:300 y 1024:576 respectivamente.
El problema, es que dichos índices no nos darían una idea clara de la proporcionalidad de la imagen al ser cantidades muy elevadas, pero, en los dos primeros ejemplos, podemos ver claramente que sería muy fácil simplificar el índice dividiendo ambas cantidades por 100, por lo que ambos quedarían como 1:1 y 4:3, y, cuya división, produce exáctamente el mismo resultado (1 en el primer caso, y 1,333….. en el segundo).
¿Qué sucede con el tercer caso?, al ser dimensiones mayores y no tan representativas nos sería muy dificil simplificarlo sin realizar cálculos adicionales, una opción obvia, sería al ver que ambas cifras son pares, dividir ambas entre 2 sucesivamente hasta que ya no sean divisibles por 2 (6 veces), el resultado sería entonces 16:9 (16/9 da como resultado exáctamente lo mismo que 1024/576: 1,7777777777…..)
Bien, ya hemos calculado el índice de las 3 imágenes, básicamente, lo que hemos hecho “de forma artesanal” es descubrir el número por el que podemos dividir ambas dimensiones sin alterar su proporción, es decir, calcular el máximo común divisor: el número entero más grande por el que pueden dividirse ambas cantidades. (En nuestros casos anteriores, el máximo común divisor ha sido 100 para la primera imagen, 100 para la segunda, y 128 en la tercera (128 es 2 elevado a 7 = 2×2 6 veces).
Todo ésto está muy bien, pero ¿cómo podemos obtener fácilmente el máximo común divisor de 2 números para crear nuestra propia función que realize el cálculo?.
2. Algoritmo de Euclides
Definición en la wikipedia: El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue originalmente descrito por Euclides en su obra Elementos. El algoritmo de Euclides extendido es una ligera modificación que permite además expresar al máximo común divisor como una combinación lineal. Este algoritmo tiene aplicaciones en diversas áreas como álgebra, teoría de números y ciencias de la computación entre otras. Con unas ligeras modificaciones suele ser utilizado en computadoras electrónicas debido a su gran eficiencia.
Algoritmo de Euclides tradicional implementado de manera recurrente (recursiva):
Función mcd(a,b):
Si b=0 entonces:
El resultado es a
En otro caso:
El resultado es mcd(b,a mod b)
3. Implementación del Algoritmo de Euclides en PHP:
function calculaMcd($a,$b) {
if ($b == 0) return $a;
return calculaMcd($b, $a % $b);
}
4. Conclusión
Mediante ésta función podemos calcular fácilmente el indice de proporcionalidad (aspect ratio) de una imagen:
$mcd = calculaMcd(1024,768);
$proporcion = (1024/$mcd) . ":" . (768/$mcd); // 4:3
Si no conoces las dimensiones de la imágen puedes obtenerlas fácilmente con la función getimagesize() de php.
12 de Junio de 2009 at 21:42
Hey, muchas gracias! me ayudo bastante en el calculo de re dimensionamiento de videos.
14 de Junio de 2009 at 13:24
tio vaya mierda, poara eso me voy a hacer calculo en un papel
14 de Junio de 2009 at 14:15
De nada Iguana, a mi me ha sido de mucha ayuda.
Swe: Hay que tener más luces amigo. Cuando tengas que calcular el aspect ratio de miles de imágnes o videos, me avisas para cronometrarte, a ver cuánto tardas en hacerlo en papel….
21 de Enero de 2010 at 19:14
no me ha servido de nada.
22 de Enero de 2010 at 14:47
Si no te ha servido de nada por el motivo que sea, pues procura dar más información por si te pudiesemos echar una mano, si no nos indicas nada más pues es dificil adivinar el porqué. A mi tampoco me sirve de nada una nave espacial porque no sé pilotarla