Image Resize with PHP and 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)

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;
}

,

  1. #1 by avinas on June 18, 2009 - 2:40 PM

    very good

(will not be published)