It takes some work, but it should give you enough to get you started.
function crop($filename, $width, $height)
{
$resource = imagecreatefrompng($filename);
$size = array(
0 => imagesx($resource),
1 => imagesy($resource),
);
$longer = (int)($size[0]/$width > $size[1]/$height);
$shorter = (int)(!$longer);
$src = array(
$longer => 0,
$shorter => ($size[$shorter]-$size[$longer])/2,
);
$new = imagecreatetruecolor($width, $height);
imagecopyresampled($new, $resource,
0, 0,
$src[0], $src[1],
$width, $height,
$size[$longer], $size[$longer]
);
}
Edit: Trying to explain the ugly hack above.
: $src_x $src_y, manual:
imagecopyresampled() src_image of width src_w height src_h (src_x, src_y) dst_image dst_w dst_h at position (dst_x, dst_y).
, $filename , src_x 0, , src_y 0. , :
$src = ($size[$shorter]-$size[$longer])/2;
if ( $longer === 1 )
{
imagecopyresampled($new, $resource,
0, 0,
$src, 0,
$width, $height,
$size[$longer], $size[$longer]
);
}
else
{
imagecopyresampled($new, $resource,
0, 0,
0, $src,
$width, $height,
$size[$longer], $size[$longer]
);
}