Левой пяткой через правое ухо, я бы сделал как-то так (для наглядности результат сохраняется в файл):
$src = './orig.jpg';
$trg = './thumb.jpg';
cropAndResize2Square($src, 128, $trg);
function cropAndResize2Square($originalPath, $targetSquareSide, $targetPath){
//get original's dimension
list($origW, $origH) = getimagesize($originalPath);
//create images
$srcImg = imagecreatefromjpeg($originalPath);
$trgImg = imagecreatetruecolor($targetSquareSide, $targetSquareSide);
//calculate source square position and side
if($origW >= $origH){
$srcSquareSide = $origH;
$srcSquareX = ($origW - $targetSquareSide) / 2;
$srcSquareY = 0;
} else {
$srcSquareSide = $origW;
$srcSquareX = 0;
$srcSquareY = ($origH - $targetSquareSide) / 2;
}
imagecopyresampled($trgImg, $srcImg,
0, 0, $srcSquareX, $srcSquareY,
$targetSquareSide, $targetSquareSide, $srcSquareSide, $srcSquareSide);
//encode and save result (default quality 75%)
imagejpeg($trgImg, $targetPath);
//clean up
imagedestroy($srcImg);
imagedestroy($trgImg);
}
P.S. Если понадобится фильтр (например, Ланчос), лучше юзать ImageMagic. Хотя, если бешенной собаке семь верст - не крюк, можно написать и ручками. Но на PHP это будет убийственно медленно :)