Escala una imágen al máximo ancho o al máximo alto, según sea su proporción y la proporción deseada, y coge la parte central del resultado garantizando la proporcion deseada.
Dicese, de una imagen de 1600 x 1200, si se solicita 350x300, la escalará a 400x300 y cogerá de 25,0 a 375,300 garantizando un escalado sin distorsión, y las medidas deseadas.
function clipImage($file, $width, $height) {
$imSrc = imagecreatefromjpeg($file);
$w = imagesx($imSrc);
$h = imagesy($imSrc);
if($width/$height>$w/$h) {
$nh = ($h/$w)*$width;
$nw = $width;
} else {
$nw = ($w/$h)*$height;
$nh = $height;
}
$dx = ($width/2)-($nw/2);
$dy = ($height/2)-($nh/2);
$imTrg = imageCreateTrueColor($width, $height);
imagecopyresized($imTrg, $imSrc, $dx, $dy, 0, 0, $nw, $nh, $w, $h);
imagedestroy($imSrc);
imagejpeg($imTrg, $file, 95);
imagedestroy($imTrg);
}