I can\'t believe I can\'t find the formula for this. I am using a PHP script called SLIR to resize images. The script asks to specify an aspect ratio for cropping. I\'d like
to get the aspect ratio just simplify the width and height like a fraction for example:
1024 4
---- = ---
768 3
the php code:
function gcd($a, $b)
{
if ($a == 0 || $b == 0)
return abs( max(abs($a), abs($b)) );
$r = $a % $b;
return ($r != 0) ?
gcd($b, $r) :
abs($b);
}
$gcd=gcd(1024,768);
echo "Aspect ratio = ". (1024/$gcd) . ":" . (768/$gcd);
If you can get one of: height, width then you can calculate the missing width height:
original width * new height / original height = new width;
original height * new width / original width = new height;
Or if you just want a ratio:
original width / original height = ratio
There is no need for you to do any kind of calculation.
Just because it says aspect ratio doesn't mean it has to be one of a limited set of commonly used ratios. It can be any pair of numbers separated by a colon.
Quoting from the SLIR usage guide:
For example, if you want your image to be exactly 150 pixels wide by 100 pixels high, you could do this:
<img src="/slir/w150-h100-c150:100/path/to/image.jpg" alt="Don't forget your alt text" />
Or, more concisely:
<img src="/slir/w150-h100-c15:10/path/to/image.jpg" alt="Don't forget your alt text" />
Note that they didn't bother to reduce that even further to c3:2
.
So, simply use the values as entered by the user: 1024:768
.
If you want to be concise, calculate the greatest common divisor of the width and height and divide both of them by that. That would reduce your 1024:768
down to 4:3
.
Here's a much simpler alternative for greatest common divisor integer ratios:
function ratio( $x, $y ){
$gcd = gmp_strval(gmp_gcd($x, $y));
return ($x/$gcd).':'.($y/$gcd);
}
The request echo ratio(25,5);
returns 5:1
.
If your server wasn't compiled with GMP functions ...
function gcd( $a, $b ){
return ($a % $b) ? gcd($b,$a % $b) : $b;
}
function ratio( $x, $y ){
$gcd = gcd($x, $y);
return ($x/$gcd).':'.($y/$gcd);
}