Friday, October 29, 2010

Image Resize with PHP/ImageMagick Maintaining Proportions

SkyHi @ Friday, October 29, 2010
There are many examples found on the web on resizing images using PHP while maintaining aspect ratio. However most of them are based on a single maximum dimension i.e. should not exceed a certain size with on either height or width.

I have written the code below that will accept a desired height and width and downsize the source image without exceeding either $maxheight or $maxwidth but still maintain proportions.

Adjust your path to ImageMagick accordingly (/usr/bin/convert)

function resizeimage($source,$dest,
    $maxwidth = 200,$maxheight = 160)
{
    list($width,$height) = getimagesize($source);
    
    /**
     * We need to get both ratios so we can 
     * find which reduced height and width 
     * will fix the max allowed dimensions.
     */
    $hRatio = $maxheight / $height;
    $wRatio = $maxwidth / $width;
    
    /**
     * Test Dimensions based on height reduction ratio.
     */
    $tHeightHR = $maxheight;
    $tWidthHR = ceil($hRatio * $width);
    
    /**
     * Test dimenstions based on width reduction ratio.
     */
    $tWidthWR = $maxwidth;
    $tHeightWR = ceil($wRatio * $height);
    
    if($width < $maxwidth AND $height < $maxheight)
    {
        echo 'Source already below maximum dimensions: ' 
            . $source . " {$width}x{$height}\n";
        return false;
    }
    
    if($tWidthHR <= $maxwidth) { 
        $height = $tHeightHR; $width = $tWidthHR; 
    }
    if($tHeightWR <= $maxheight) { 
        $height = $tHeightWR; $width = $tWidthWR; 
    }
    
    $cmd = "/usr/bin/convert -resize {$width}x{$height} "
        . "\"{$source}\" \"{$dest}\" 2>&1";
    @exec($cmd,$output,$retvar);

    if($retvar != 0) 
    {
        echo implode(" -- ",$output);
        return false;
    }
    
    return true;
}  

REFERENCES
http://www.lampadmins.com/f17/image-resize-php-imagemagick-maintaining-proportions-14/
http://www.imagemagick.org/Usage/resize/