View Single Post
  #1 (permalink)  
Old 02-05-2009, 08:45 AM
zoticai+c's Avatar
zoticai+c zoticai+c is offline
Ambiguos Variable
 
Join Date: Jan 2009
Posts: 3,163
Lightbulb Image Resize with PHP/ImageMagick Maintaining Proportions

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)


PHP Code:
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;

This tutorial is also available from my blog.
Reply With Quote